C-无需计算机的数据类型转换

C-无需计算机的数据类型转换,c,printf,short,C,Printf,Short,我有一个来自学校考试的样题。在纸上解决这个问题最简单的方法是什么? 问题是: 运行时系统使用2的补码表示整数。数据类型int的大小为32位,数据类型short的大小为16位。printf显示了什么?(答案是ffffe43c) 让我们分两步进行:1bc4=1bc3+1 首先,我们在long上做这个: 0 - 1 = ffffffff 然后 ffffffff - 1bc3 这可以通过符号来完成 ffffffff - 00001bc3 您将得到您所得到的结果让我们分两步进行:1bc4=1b

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

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


让我们分两步进行:1bc4=1bc3+1

首先,我们在long上做这个:

0 - 1 = ffffffff
然后

ffffffff - 1bc3
这可以通过符号来完成

 ffffffff
-
 00001bc3

您将得到您所得到的结果

让我们分两步进行:1bc4=1bc3+1

首先,我们在long上做这个:

0 - 1 = ffffffff
然后

ffffffff - 1bc3
这可以通过符号来完成

 ffffffff
-
 00001bc3

你会得到你得到的结果,因为你的
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)
1111 1111 1111 1111 1110 0100 0011 1100 == 0xFFFFE43C
这就是您的号码在内部的表示方式

现在,
%x
需要一个32位整数,因此计算机将对值进行符号扩展,将MSB复制到值的上16位,从而生成:

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)
1111 1111 1111 1111 1110 0100 0011 1100 == 0xFFFFE43C

因为你的
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)
1111 1111 1111 1111 1110 0100 0011 1100 == 0xFFFFE43C
这就是您的号码在内部的表示方式

现在,
%x
需要一个32位整数,因此计算机将对值进行符号扩展,将MSB复制到值的上16位,从而生成:

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)
1111 1111 1111 1111 1110 0100 0011 1100 == 0xFFFFE43C

这应该是未定义的行为,因为您正在将
short
馈送到
%x
,这是一种类型不匹配的行为。@Dan参数传递会自动升级为
int
,并带有符号扩展名。由于整数的负表示是指定的,我认为它不是未定义的。哦,好吧,那我就接受这个解释。请不要在标题中放“[solved]”或类似的东西。如果其中一个答案对你起作用,考虑一下,我们是如何在这里回答问题的。这应该是未定义的行为,因为你把<代码>短<代码>输入到<代码> %x中,这是一种类型的错配。@丹参数通过自动扩展到<代码> INT/COM>,带有符号扩展。由于整数的负表示是指定的,我认为它不是未定义的。哦,好吧,那我就接受这个解释。请不要在标题中放“[solved]”或类似的东西。如果其中一个答案对你起作用,考虑一下,我们是如何在这里回答问题的。(我想让你放弃投票,但我没有足够的声誉)很好,谢谢!(我想让你放弃投票,但我没有足够的声誉)哦,这就是F的来源。谢谢哦,这就是F的来源。非常感谢。