UINT_MAX的所有位都设置为1吗?

时间:2017-02-17 11:59:42

标签: c++ c language-lawyer

此问题之前被问到,但我仍感到困惑。

我知道

unsigned int a = -1;

将是UINT_MAX。但这并不是因为-1的所有位都已设置。 C11说

  

如果新类型是无符号的,则通过重复添加或转换该值   减去一个可以在新类型中表示的最大值   直到该值在新类型的范围内

所以我们说UINT_MAX是100(我知道它应该大于2 ^ 16-1但我们暂时忽略它)

unsigned int a = -1; // will be
unsigned int a = -1 + UINT_MAX + 1; // 100 = UINT_MAX  

标准仅说UINT_MAX >= 2^16-1。但它是否应该说它应该是2 ^ n-1?

在C ++中答案也不同吗?

3 个答案:

答案 0 :(得分:46)

在C中,无符号整数的最大值必须采用 1 形式:2 N - 1。

因此,值UINT_MAX的所有位都将设置为1.可能存在 padding 位,其值未指定。

1 (引自:ISO / IEC 9899:201x 6.2.6.2整数类型1)
对于unsigned char以外的无符号整数类型,对象表示的位应分为两组:值位和填充位(不需要后者中的任何一个)。如果有 N 值位,则每个位应表示1和2 N -1 之间的2的不同幂,因此type应能够使用纯二进制表示来表示0到2 N -1的值;这应该被称为价值表示。任何填充位的值都未指定。

答案 1 :(得分:12)

不,不完全。

无符号类型可以包含值位填充位

对于最大值,值的位始终设置为1是正确的,但填充位的具体值留给实现。所以这意味着UINT_MAX需要是 Mersenne数。其他要求规定它不能低于65535。

C和C ++在这方面是等价的。

答案 2 :(得分:2)

你说通过转换的定义,转换为unsigned int的-1保证为UINT_MAX是正确的。它与任何位模式无关。如果存在UINT_MAX为100的实现,那么-1转换为unsigned int将为100.

UINT_MAX不能为100的原因有一个:一,因为它必须≥2^ 16-1,但这将允许UINT_MAX = 1,000,000。其次,因为unsigned int必须有一个二进制表示,其中有一些固定数量为n的值位,所以UINT_MAX = 2 ^ n - 1.

可能是INT_MAX = 2 ^ 31-1和UINT_MAX = 2 ^ 31-1(通常不是2 ^ 32-1)。在这种情况下,-1将设置32位; -1转换为unsigned int将是2 ^ 31 - 1并且仅设置31位。