我有一个来自我学校测试的示例问题。哪种方式在纸上解决最简单?
问题:
运行时系统使用二进制补码表示整数。数据类型int的大小为32位,数据类型short的大小为16位。 printf显示什么?(答案是 ffffe43c )
short int x = -0x1bc4; /* !!! short */
printf ( "%x", x );
答案 0 :(得分:1)
让我们分两步:1bc4 = 1bc3 + 1
首先,我们长期做这件事:
0 - 1 = ffffffff
然后
ffffffff - 1bc3
这可以通过符号来完成
ffffffff
-
00001bc3
你会得到你的结果
答案 1 :(得分:0)
由于你的x
是否定的,所以请使用它的两个补码:
2's(-x) = ~(x) + 1
2's(-0x1BC4) = ~(0x1BC4) + 1 => 0xE43C
0x1BC4 = 0001 1011 1100 0100
~0X1BC4 =1110 0100 0011 1011
+1 = [1]110 0100 0011 1100 (brackets around MSB)
这是您的号码在内部表示的方式。
现在%x
需要一个32位整数,因此您的计算机将对您的值进行符号扩展,将MSB复制到您的值的高16位,这将产生:
1111 1111 1111 1111 1110 0100 0011 1100 == 0xFFFFE43C