这是一个程序,它的编译输出让我哭泣:

#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

09-04 16:36