我有一个 __int64 变量x = 0x8000000000000000
。
我尝试按字节右移:x >> 4
我认为结果应该是0x0800000000000000
,但不幸的是我得到了0xf800000000000000
。
我用VS10。为什么会这样?我该如何解决呢?
我有一个 __int64 变量x = 0x8000000000000000
。
我尝试按字节右移:x >> 4
我认为结果应该是0x0800000000000000
,但不幸的是我得到了0xf800000000000000
。
我用VS10。为什么会这样?我该如何解决呢?
尝试使用__uint64 variable x = 0x8000000000000000
我认为您也可以这样声明:
u64 x = 0x8000000000000000;
x >> 4
你会给你:
0x0800000000000000
有关更多信息,请参阅F
MSB中的来源。
嗯,这很容易。:)
您的号码已签名。设置第一位后,它是负数。因此,为了保持负数,它被填充为 1。
我认为将其转换为未签名然后将其转换应该可以解决您的问题。
原因是因为移位有符号数字仅在左操作数至少为 0 时由语言定义。在您的情况下,我假设它是二进制补码表示,并且您的数字为负数,因此结果未指定(或实现定义,我不'现在手头没有参考)。通常,您将获得逻辑移位或算术移位。
如果您可以摆脱使变量无符号的情况,那将解决您的问题。
这是因为你有一个负数。在班次之前使用(或转换为)无符号。
有符号值右移符号位,无符号零:
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