C - 没有计算机的数据类型转换

时间:2013-10-18 14:17:14

标签: c printf short

我有一个来自我学校测试的示例问题。哪种方式在纸上解决最简单?

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

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

printf ( "%x", x );

2 个答案:

答案 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