将32位整数移位32位

我正在甩掉一些C代码,我需要将32位int位移位32位。 当我使用参数n = 0运行此代码时,不会发生转换。

int x = 0xFFFFFFFF; int y = x << (32 - n); 

为什么这不起作用?

转移自己的危险。 根据标准,您要做的是未定义的行为

C99§6.5.7

3 – 对每个操作数执行整数提升。 结果的类型是提升的左操作数的类型。 如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。

换句话说,如果您尝试将32位值移动超过31位或负数,则结果是未定义的。

根据C89(?)标准草案中的 3.3.7位按位移位算子

如果右操作数的值为负或大于或等于提升的左操作数的位宽,则行为未定义。

假设你在编译代码的系统上int是32位,当n是0时,你正在移位32位。 根据上面的陈述,您的代码会导致未定义的行为