从short到int的C类型提升谜题

5
我有一个问题需要专家指导:
1. 当将具有short类型的值作为参数传递给printf()函数时,它会自动提升为int类型,因此printf()函数将把该值视为int类型而不是short类型。
2. 因此,short类型基本上是16位宽,即0000000000000000,而int类型是32位宽,即00000000000000000000000000000000。
3. 假设我声明一个名为num的变量,其类型为short,并将其初始化为-32,这意味着short类型的最高有效位将是1,即0000000011100000。
4. 当我将这个值传递给printf()时,它将转换为int类型,因此它将变为00000000000000000000000011100000。
5. 在第4步中,当它被转换为int时,最高有效位为0。
6. 为什么当我使用%hd说明符甚至是%d说明符时,它仍然会提示我输入负值而不是正值?
3个回答

9
不,short和int都是有符号类型,所以它们被符号扩展而不是0字节填充提升:
-32 short =                   11111111 11100000 
-32 int   = 11111111 11111111 11111111 11100000

将最高有效位(MSB)保留为1,即负数。

您可以通过先将其转换为无符号类型来模拟您期望的行为,例如:

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

3
在二进制补码中,这是绝对正确的。对于其他表示方法,类似的情况也会发生。 - Oliver Charlesworth
3
当从 short 类型转换为 int 类型时,Oli 表示确保数字的真实数学值得到保留。在二进制补码和反码中,这意味着进行符号扩展。在原码中,则表示在符号位右侧进行零填充。 - Steve Jessop

2

将short转换为int基本上是将short的最高位复制到int的顶部16位中。这就是为什么int被打印为负数的原因。如果您不想使用这种行为,请使用ushort


2

正如您所说,这里涉及到了转换和转化,它们都与知识相关。也就是说,编译器知道有符号短整型向整型的转换方式。它不仅仅只是在前面添加一些位,而是创建一个新的整型,其值与原始的短整型相同。因此,您得到了正确的数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接