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的来源。非常感谢。