用64位int移位

时间:2013-01-30 22:15:46

标签: c++ c visual-studio-2010 64-bit shift

我有一个__int64变量x = 0x8000000000000000

我尝试逐字节移动:x >> 4

我认为结果应为0x0800000000000000,但遗憾的是我得到0xf800000000000000

我使用VS10。为什么会这样?我该如何解决?

5 个答案:

答案 0 :(得分:4)

尝试使用__uint64 variable x = 0x8000000000000000

我认为你也可以这样宣布:

u64 x = 0x8000000000000000;

x >> 4你会给你:

0x0800000000000000

查看有关MSB中Ffrom的更多信息。

答案 1 :(得分:2)

嗯,这很简单。 :)

您的电话号码已签名。设置第一位后,它是负数。因此,为了保持负面,它充满了1s。

我会假设将它转换为无符号,然后移动它应该解决你的问题。

答案 2 :(得分:2)

原因是因为如果左操作数至少为0,则移位带符号的数字仅由语言定义。在您的情况下,我假设它是二进制补码表示,并且您的数字为负,使得结果未指定(或实现定义) ,我现在手边没有参考资料)。通常,您可以获得逻辑移位或算术移位。

如果你可以让你的变量无符号,这将解决你的问题。

答案 3 :(得分:1)

这是因为你有一个负数。在班次之前使用(或转换为)无符号。

答案 4 :(得分:1)

有符号值按符号位右移,无符号为零:

int _tmain(int argc, _TCHAR* argv[])
{
    __int64  signedval;
    unsigned __int64  unsignedval;

    signedval=0x8000000000000000 >> 4;
    unsignedval=0x8000000000000000 >> 4;

        printf(" Signed %x  , unsigned %x   \n", signedval, unsignedval);

        getchar();

    return 0;
}

,输出为:

Signed 0  , unsigned 8000000