将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位。 根据上面的陈述,您的代码会导致未定义的行为 。