用64位int移位

我有一个__int64变量x = 0x8000000000000000

我尝试按字节顺序移动: x >> 4

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

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

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

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

尝试使用__uint64 variable x = 0x8000000000000000

我想你也可以用这种方式声明:

 u64 x = 0x8000000000000000; 

x >> 4你会给你:

 0x0800000000000000 

有关F来自MSB的更多信息,请参阅。

嗯,这很简单。 🙂

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

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

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

有符号值按符号位右移,无符号对齐:

 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