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;
}