【发布时间】:2013-01-30 22:15:45
【问题描述】:
我有一个 __int64 变量 x = 0x8000000000000000。
我尝试按字节右移:x >> 4
我认为结果应该是0x0800000000000000,但不幸的是我得到了0xf800000000000000。
我使用 VS10。为什么会这样?我该如何解决?
【问题讨论】:
-
你应该阅读sign extension。看起来您可能想要一个无符号值 - 我猜是
__uint64? -
@CarlNorum - 将 0x8000000000000000 定义为无符号是否合法? - MSB = 1
-
0x8000000000000000与所有十六进制文字一样,根据定义,一开始就是无符号的。您的分配/初始化正在将其转换为已签名。 -
@CarlNorum 这不太正确,不带后缀的十六进制或八进制常量的类型是
int、unsigned int、long int、unsigned long int、long long int、@中的第一个987654333@,其中可以表示常量的值(如果有)。不过,0x8000000000000000的类型通常为unsigned long或unsigned long long。 -
@Daniel - 对。对不起,我记错了。在这种情况下,几乎可以肯定,正如您提到的那样,它是未签名的。
标签: c++ c visual-studio-2010 64-bit shift