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的值; 这应该被称为价值表示.任何填充位的值都未指定.
Bat*_*eba 11
不,不完全.
无符号类型可以由值位和填充位组成.
您是正确的,最大值的值位始终设置为1,但填充位的具体值留给实现.所以这意味着UINT_MAX需要是一个Mersenne数.其他要求规定它不能低于65535.
在这方面,C和C++是等价的.
| 归档时间: |
|
| 查看次数: |
3625 次 |
| 最近记录: |