1

我有一个 __int64 变量x = 0x8000000000000000

我尝试按字节右移:x >> 4

我认为结果应该是0x0800000000000000,但不幸的是我得到了0xf800000000000000

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

4

5 回答 5

4

尝试使用__uint64 variable x = 0x8000000000000000

我认为您也可以这样声明:

u64 x = 0x8000000000000000;

x >> 4你会给你:

0x0800000000000000

有关更多信息,请参阅FMSB的来源。

于 2013-01-30T22:17:47.083 回答
2

嗯,这很容易。:)

您的号码已签名。设置第一位后,它是负数。因此,为了保持负数,它被填充为 1。

我认为将其转换为未签名然后将其转换应该可以解决您的问题。

于 2013-01-30T22:18:28.177 回答
2

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

如果您可以摆脱使变量无符号的情况,那将解决您的问题。

于 2013-01-30T23:52:24.617 回答
1

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

于 2013-01-30T22:17:44.663 回答
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 
于 2013-01-30T22:44:33.540 回答