这是一个程序,它的编译输出让我哭泣:
#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,不是吗?我哪里做错了? 最佳答案
有两个错误:1
属于int
类型,因此您计算的初始值是int
,而不是uint32_t
。
正如警告所说,移位运算符的移位参数必须小于类型的宽度。1 << 32
是未定义的行为,如果int
小于或等于32位。(uint32_t)1 << 32
也没有定义。
(还要注意,如果1 << 31
是32位的,则由于溢出,int
也将是未定义的行为)
因为算术是按模进行的,所以更简单的方法是
uint32_t x = -1;
uint32_t y = (uint32_t)0 - 1; // this way avoids compiler warnings