【发布时间】:2016-09-23 18:03:59
【问题描述】:
这是编译输出让我哭的程序:
#include <inttypes.h>
int main()
{
uint32_t limit = (1 << 32) - 1; // 2^32 - 1 right?
}
这是编译输出:
~/workspace/CCode$ gcc uint32.c
uint32.c: In function ‘main’:
uint32.c:5:29: warning: left shift count >= width of type [-Wshift-count-overflow]
uint32_t limit = (1 << 32) - 1; // 2^32 - 1 right?
我认为(1 << 32) - 1 等于 2^32 - 1 并且 32 位上的无符号整数范围从 0 到 2^32 - 1,不是吗?我哪里做错了?
【问题讨论】:
-
对于 32 位 int,2^32 - 1 将适合(无符号)...问题是,2^32 不会,它是您计算 2^32- 表达式的一部分1 与。但是,由于其他原因,您最终可能会得到正确的答案,因为 uint32_t 将以 2^32 为模。
-
为什么不只是
0xFFFFFFFF? -
@jxh 1ULL
-
ULL后缀表示常量属于unsigned long long。 -
@Simonlbc 这是一个
unsigned long long字面量,至少有 64 位宽。