算术右移后的意外结果

时间:2014-09-17 02:22:14

标签: c bit-manipulation low-level

在下面的代码中,当我通过 31 算术右移MSB3(恰好是0)时,我得到 2

但当我用 0 替换MSB3时,我得到 0 ,这是我在第一种情况下期待的结果。

为什么会这样?

    const int value = 0;  //This happens after adding 0x80000000 to 0x80000000
    const int mask = 0x1;
    const int mask2 = mask << 31;
    const int MSB3 = value & mask2; // MSB3 = 0
    const int trueMSB3 = (MSB3 >> 31) // This gives 2 rather than 0???
    const int trueMSB3 = (0 >> 31) //Gives 0

1 个答案:

答案 0 :(得分:2)

如果您有64位int,那么这是不可能的,因为您已经描述过;因为转移0总是给0。 &#34;真实代码&#34;必须与你发布的内容不同。

如果你有32位int,那么你的程序已经通过mask << 31引起了未定义的行为。移入符号位会导致UB。结果是任何事情都可能发生;包括后续代码打印2或正在发射的导弹。

您的第一条评论表明可能是&#34;真实代码&#34;没有const int value = 0;,但是您描述的其他一些代码。发布真实代码会更好。根据您的描述,该代码也可能具有未定义的行为。

要在进行移位时获得明确定义的结果,请改用无符号整数。要获得更好的帮助,请将发布的代码更新为MCVE,并包含您所使用的编译器和系统。