C++ UINT_MAX是否将所有位都设置为1?

C++ UINT_MAX是否将所有位都设置为1?,c++,c,language-lawyer,C++,C,Language Lawyer,这个问题以前有人问过,但我仍然感到困惑 我知道 unsigned int a = -1; 将是UINT\u MAX。但这并不是因为-1的所有位都已设置。C11表示 如果新类型是无符号的,则通过反复添加或 比新类型中可以表示的最大值多减去一个 直到值在新类型的范围内 所以让我们假设UINT_MAX是100(我知道它应该大于2^16-1,但现在我们忽略它) 标准仅说明UINT\u MAX>=2^16-1。但是它有没有说它应该是2^n-1 在C++中,答案也不同,< P>,无符号整数的最大值必须在F

这个问题以前有人问过,但我仍然感到困惑

我知道

unsigned int a = -1;
将是
UINT\u MAX
。但这并不是因为-1的所有位都已设置。C11表示

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

所以让我们假设
UINT_MAX
是100(我知道它应该大于2^16-1,但现在我们忽略它)

标准仅说明
UINT\u MAX>=2^16-1
。但是它有没有说它应该是2^n-1


在C++中,答案也不同,

< P>,无符号整数的最大值必须在Frime1:2N-1。< /P> 因此,值UINT_MAX的所有值位都将设置为1。可能存在未指定值的填充位


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

不,不完全指定

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

对于最大值,值位始终设置为1,这是正确的,但填充位的特定值留给实现。这意味着UINT_MAX需要是一个梅森数。其他要求规定不能小于65535


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

< P>你可以说,通过转换的定义,-1转换为无符号int是保证Uint最大的。它与任何位模式没有任何关系。如果有一个实现,其中UINT_MAX是100,那么转换为无符号int的-1将是100

UINT_MAX不能为100有很多原因:一是因为它必须为100≥ 2^16-1,但这将允许UINT_MAX=1000000。第二,因为无符号int必须有一个二进制表示形式,具有固定数量的n个值位,所以UINT_MAX=2^n-1


可能是INT_MAX=2^31-1和UINT_MAX=2^31-1(而不是通常的2^32-1)。在这种情况下,-1将设置32位-1转换为无符号整数将是2^31-1,并且只设置了31位

我认为该标准大多未指定值的精确位表示(或依赖于平台)。有(已经)一些非常奇怪的体系结构。但这仍然要求UINT_MAX必须是2^n-1的形式,因为有些n>=16。确实是这样的:即梅森数(不一定是素数),大于或等于65535。我在C++14标准中找不到任何关于基本类型有任何填充位的内容。我在
[basic.basical]
中看到的引用C标准的唯一想法是,它必须遵守C 5.2.4.2.1,这是限制部分。细微的挑剔:最好澄清对梅森数的引用,就像p素数一样。尽管p经常被泛化为每一个正整数,并滥用符号。微小的挑剔:1+31位
有符号int
中的1如果实现使用2的补码,则设置了32位,这几乎是自80年代中期以来所有机器对整数所做的,但是6.2.6.2p2允许1的补码或符号和大小分别为31位和2位。@dave_thompson_085:具有32位2的补码有符号整数的系统几乎肯定也具有32位无符号整数。非人工实现的
无符号
类型的可能值少于相应有符号类型的唯一原因是硬件仅限于一种无法容纳2的有符号算术形式ⁿ 不同的价值观。我猜你不能为三元计算机编写C编译器。嗯。。。你可以,那会很糟糕:P@Mark:您只需逐个字节模拟8位base-2溢出。因此基本上:生成的二进制文件必须在base-2模拟器中运行。
unsigned int a = -1; // will be
unsigned int a = -1 + UINT_MAX + 1; // 100 = UINT_MAX