我有一个问题需要任何专家的指导:
当short
类型的值作为参数传递给printf()
函数时,它会自动提升为int
类型,这就是{{1 }}函数会将值视为printf()
类型,而不是int
类型。
所以基本上short
类型是16位宽,short
而0000000000000000
类型是32位宽,int
。
假设我声明了一个带00000000000000000000000000000000
类型的变量调用num
,并使用值-32初始化它,这意味着short
类型的最重要位将是short
,即1
。
当我将此值传递给0000000011100000
时,它会转换为printf()
类型,因此它将变为int
。
在第4步中,当转换为00000000000000000000000011100000
时,最重要的位为int
。
为什么当我使用0
说明符甚至%hd
说明符时,它仍会提示我输入负值而不是正数?
答案 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。这就是你获得正确号码的原因。