将32位整数移位32位

时间:2013-09-14 07:16:07

标签: c bit-shift bits low-level

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

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

为什么这不起作用?

2 个答案:

答案 0 :(得分:10)

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

  

C99§6.5.7

     

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

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

答案 1 :(得分:3)

根据draft of C89 (?) standard中的 3.3.7按位移位运算符部分:

  

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

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