C 意外的左移行为
可能重复:C 意外的左移行为,c,bit-shift,C,Bit Shift,可能重复: 考虑以下最小程序 #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; } 现在打印的结果是0。有人能解释这种行为吗?在C中,将32位值移位32位是未定义的行为。不要这样做。两者都是未定义
考虑以下最小程序
#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;
}
现在打印的结果是
0
。有人能解释这种行为吗?在C中,将32位值移位32位是未定义的行为。不要这样做。两者都是未定义的行为,因为移位距离必须小于类型的位宽度。有了这个常量,gcc的Optimizer会做您期望的事情,但有了这个变量,转换就在运行时完成了。移位距离可能被31掩盖,因此不进行移位,并且1-1==0
#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;
}