通过C类型促销从简短到整数拼图

时间:2011-05-09 09:14:46

标签: c types int short

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

  1. short类型的值作为参数传递给printf()函数时,它会自动提升为int类型,这就是{{1 }}函数会将值视为printf()类型,而不是int类型。

  2. 所以基本上short类型是16位宽,short0000000000000000类型是32位宽,int

  3. 假设我声明了一个带00000000000000000000000000000000类型的变量调用num,并使用值-32初始化它,这意味着short类型的最重要位将是short,即1

  4. 当我将此值传递给0000000011100000时,它会转换为printf()类型,因此它将变为int

  5. 在第4步中,当转换为00000000000000000000000011100000时,最重要的位为int

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

3 个答案:

答案 0 :(得分:9)

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

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

将MSB保持为1,即为负。

你可以先伪装无符号来伪造你期望的行为,例如

printf("%d", (unsigned short)((short)(-32)));

答案 1 :(得分:2)

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

这种行为

答案 2 :(得分:2)

正如你所说,它被转换,在这种情况下转换意味着knowlegde。那就是编译器知道如何签署short to int转换工作。它不只是在前面附加位,它创建一个与short相同的新int。这就是你获得正确号码的原因。