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

32 c c++ language-lawyer

这个问题之前被问过,但我仍然感到困惑.

我知道

unsigned int a = -1;
Run Code Online (Sandbox Code Playgroud)

会的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  
Run Code Online (Sandbox Code Playgroud)

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

在C++中答案也不同?

250*_*501 45

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

因此,值UINT_MAX的所有位将被设置为1.可能存在填充位,其值未指定.


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

  • 呵呵.我想你不能为三元计算机编写C编译器. (3认同)
  • @Mark:你只需要模拟8位基2字节的字节溢出.所以基本上:生成的二进制文件必须在base-2模拟器中运行. (3认同)

Bat*_*eba 11

不,不完全.

无符号类型可以由值位填充位组成.

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

在这方面,C和C++是等价的.

  • 轻微的挑剔:将梅森数字的引用澄清为[该术语通常保留为2 ^ p-1](https://oeis.org/A000225),*p*prime.虽然*p*经常被广义化,滥用符号,但每个正整数. (4认同)