C ++试图将数字右移32,得到两个不同的结果

时间:2017-10-28 21:17:35

标签: c++ bit-shift

我正在写一个小程序来获得一些位操作的经验,我遇到了这种情况。我试图创建一个掩码,将0的所有位从MSB设置为某个数字n。当我的n是32时,问题就出现了。这里有一些代码可以证明这个问题。

int n = (sizeof(int) * 8) - 0; //Here n is basically set to 32.
    std::cout << n << std::endl; //And indeed, this prints 32.

    //here I expect to see 0 (basically all 32 bits of the number should be 0`s, but I see the opposite, all bits are set to 1.)
    std::cout << ((unsigned) ~0 >> n) << std::endl;

    //And this indeed does what I expected and all 32 bits of the nuber are set to 0`s.
    std::cout << ((unsigned) ~0 >> 32) << std::endl;

我的问题是,因为n = 32,为什么我在这里看到2个不同的结果,其中第一个我看到32 s and in the 2nd case, I am seeing 32 0 s?

1 个答案:

答案 0 :(得分:0)

编辑:显然这是错的,原始海报测试了它(谢谢!)。如果有人有更好的解释,我会把它留作一个想法。

我认为你没有考虑你的类型被投放到什么地方。 您可能在64位计算机上执行此操作,因此n是32位无符号整数,但数字32是64位长整数。

~0成为无符号整数(32位)

n是32位无符号整数

32(可能)是64位长

组合~0(32位)和n(32位)可能会给出32位的答案

而组合~0(32位)和32(64位)给出了64位的答案

如您对问题的评论中所述,将数字移位所有位是未定义的行为,但将它们移位到64位整数32位应该可以正常工作! < / p>

这是我最好的猜测,我没有对此进行测试。