【问题标题】:C - data type conversion without computerC - 无需计算机的数据类型转换
【发布时间】:2013-10-18 14:17:14
【问题描述】:

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

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

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

printf ( "%x", x );

【问题讨论】:

  • 这应该是未定义的行为,因为您将 short 输入到 %x 中,这是一种类型不匹配。
  • @Dan 参数传递自动提升为int,带有符号扩展。由于指定了整数的负表示,我不认为它是未定义的。
  • 哦,好吧,那我就买那个解释了。
  • 请不要在标题中添加“[已解决]”或其他类似内容。如果其中一个答案对您有用,请考虑 accepting it,这是我们在此处将问题标记为已回答的方式。

标签: c printf short


【解决方案1】:

让我们分两步完成:1bc4 = 1bc3 + 1

首先,我们将其设为 long:

0 - 1 = ffffffff

然后

ffffffff - 1bc3

这可以通过符号来完成

 ffffffff
-
 00001bc3

你会得到你所拥有的结果

【讨论】:

  • 很好,谢谢! (我想给你投票,但我没有足够的声誉)
【解决方案2】:

因为你的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

【讨论】:

  • 哦,这就是 F 的来源。谢谢
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2010-10-06
  • 2018-11-26
相关资源
最近更新 更多