可能重复:
GCC 左移溢出
考虑以下最小程序。
#include <stdint.h>
#include <stdio.h>
int main()
{
uint32_t v = 1024;
v &= (((uint32_t)1 << 32) - 1);
printf("v = %u\n", v);
return 0;
}
正如1024
我所期望的那样在 MinGW 下使用 GCC 进行编译。因为 1 向左移动 32 次又是 0,因此 0-1 = -1 即“1111....1111”。这个与任何值的 AND 应该再次返回相同的值。
但是,如果我将程序更改为
#include <stdint.h>
#include <stdio.h>
int main()
{
unsigned int s = 32;
uint32_t v = 1024;
v &= (((uint32_t)1 << s) - 1);
printf("v = %u\n", v);
return 0;
}
现在打印的结果是0
. 有人可以解释这种行为吗?