我正在使用一些C代码,我需要将32位int位移位32位。当我使用参数n = 0运行此代码时,不会发生移位。
int x = 0xFFFFFFFF;
int y = x << (32 - n);
为什么这不起作用?
答案 0 :(得分:10)
转移自己的危险。根据标准,您要做的是未定义的行为。
C99§6.5.7
3 - 对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。
换句话说,如果您尝试将32位值移动超过31位或负数,则结果是未定义的。
答案 1 :(得分:3)
根据draft of C89 (?) standard中的 3.3.7按位移位运算符部分:
如果右操作数的值为负或大于或等于提升左操作数的位宽,则行为未定义。
假设您正在编译代码的系统上int
是32位,当n
为0时,您正在移位32位。根据上述声明,您的代码会导致未定义的行为。