cma*_*ter 15 c c++ standards c11
我知道,C标准很好地定义了(unsigned)-1必须产生2 ^ n-1,即一个无符号整数,其所有位都设置好.同样的道理(uint64_t)-1ll.但是,我在C11标准中找不到指定如何(uint64_t)-1解释的东西.
因此,问题是:C标准中是否有任何保证,以下哪项适用?
(uint64_t)-1 == (uint64_t)(unsigned)-1 //0x00000000ffffffff
(uint64_t)-1 == (uint64_t)(int64_t)-1 //0xffffffffffffffff
Run Code Online (Sandbox Code Playgroud)
R..*_*R.. 14
是.参见C11 6.3.1.3有符号和无符号整数:
1当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变.
2否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.60)
3否则,新类型已签名且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号.
60)规则描述了数学值的算术,而不是给定类型表达式的值.
情况2适用,因此-1减少模0x10000000000000000以产生0xffffffffffffffff.
表达式1和-1类型int.转换为uint64_t2时,加上或减去2 n直到该值在范围内的原则适用,因此结果总是2 n -1,在这种情况下n = 64.因此,(uint64_t)-1总是2 64 -1 ..
表达式的(int64_t)-1计算结果为-1,因此相同的推理适用于表达式(uint64_t)(int64_t)-1,该表达式也总是计算为2 64 -1.
另一方面,取决于编译平台(unsigned)-1,类型的正值unsigned int可以是2 16 -1,2 32 -1,2 64 -1或各种其他值.转换为时,这些值可能不会产生2 64 -1 uint64_t.
| 归档时间: |
|
| 查看次数: |
5258 次 |
| 最近记录: |