5

我有一个问题需要任何专家的指导:

  1. 由于具有short类型的值作为参数传递给printf()函数,它将自动提升为int类型,这就是为什么printf()函数将值视为int类型而不是short类型的原因。

  2. 所以基本上shorttype 是 16 位宽,0000000000000000inttype 是 32 位宽,即00000000000000000000000000000000.

  3. 假设我numshorttype 声明了一个变量调用并将其初始化为 -32 的值,这意味着该short类型的最高有效位将是1,即0000000011100000

  4. 当我将此值传递给 时printf(),它会被转换为int类型,所以它会变成00000000000000000000000011100000.

  5. 在步骤 4 中,当它转换为 时int,最高有效位是0

  6. 为什么,当我使用说明%hd符甚至说明%d符时,它仍然会提示我输入负值而不是正值?

4

3 回答 3

9

不,short 和 int 都是有符号类型,因此它是通过符号扩展而不是 0 字节填充来提升的:

-32 short =                   11111111 11100000 
-32 int   = 11111111 11111111 11111111 11100000

将 MSB 保留为 1,即负数。

您可以通过先将其转换为未签名来伪造您期望的行为,例如

printf("%d", (unsigned short)((short)(-32)));
于 2011-05-09T09:23:09.213 回答
2

正如您所说,它是转换的,在这种情况下转换意味着知识。那就是编译器知道有符号的 short 到 int 的转换是如何工作的。它不只是在前面附加位,它会创建一个与 short 值相同的新 int。这就是为什么你得到正确的号码。

于 2011-05-09T09:25:14.987 回答
2

将 short 转换为 int 基本上将 short 的最重要位复制到 int 的前 16 位。这就是为什么 int 被打印为负数的原因。如果您不希望使用ushort.

于 2011-05-09T09:22:26.087 回答