我有一个__int64变量x = 0x8000000000000000
。
我尝试逐字节移动:x >> 4
我认为结果应为0x0800000000000000
,但遗憾的是我得到0xf800000000000000
。
我使用VS10。为什么会这样?我该如何解决?
答案 0 :(得分:4)
尝试使用__uint64 variable x = 0x8000000000000000
我认为你也可以这样宣布:
u64 x = 0x8000000000000000;
x >> 4
你会给你:
0x0800000000000000
查看有关MSB中F
来from的更多信息。
答案 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