1

我有一个来自我学校的测试样本问题。在纸上解决它最简单的方法是什么?

问题:
运行时系统使用二进制补码表示整数。数据类型 int 大小为 32 位,数据类型 short 大小为 16 位。printf 显示什么?(答案是ffffe43c

short int x = -0x1bc4; /* !!! short */

printf ( "%x", x );
4

2 回答 2

1

让我们分两步来做:1bc4 = 1bc3 + 1

首先我们把它做长:

0 - 1 = ffffffff

然后

ffffffff - 1bc3

这可以通过符号来完成

 ffffffff
-
 00001bc3

你会得到你的结果

于 2013-10-18T14:25:17.083 回答
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
于 2013-10-18T14:27:18.760 回答