【发布时间】:2014-07-10 02:29:15
【问题描述】:
我正在尝试通过将十六进制FFFFFFFF 右移1 来判断我的PC 是执行算术右移还是逻辑右移。
我知道整数-1 在十六进制中读作FFFFFFFF,因为它是1 的二进制补码。将-1 右移1 得到FFFFFFFF 并显示PC 执行算术右移。
但如果我只输入0xFFFFFFFF >> 1,它会导致7FFFFFFF,并显示PC 执行了逻辑右移。为什么会这样?请参阅下面产生结果的代码:
#include <stdlib.h>
#include <stdio.h>
int main ( int argc, char *argv[] )
{
printf ( "%x >> 1 = %x\n", -1, -1 >> 1 );
printf ( "%x >> 1 = %x\n", 0xffffffff, 0xffffffff >> 1 );
return EXIT_SUCCESS;
}
程序的输出是:
ffffffff >> 1 = ffffffff
ffffffff >> 1 = 7fffffff
【问题讨论】:
-
-1已签名。0xffffffff未签名。与printf()无关。 -
右移负符号值是实现定义的:
-1 >> 1也可以打印为7fffffff。
标签: c bitwise-operators bit-shift