我有一个问题需要任何专家的指导:
由于带有short
类型的值作为参数传递给printf()
函数,它将自动提升为int
类型,这就是printf()
函数将值视为int
类型而不是short
类型的原因.
所以基本上short
类型是16位宽,也就是0000000000000000
同时int
的类型是32位宽,这是00000000000000000000000000000000
.
假设我声明了一个num
带short
类型的变量调用,并用值-32初始化它,这意味着该short
类型的最高位将是1
,即0000000011100000
.
当我将此值传递给printf()
它时,它将被转换为int
类型,因此它将成为00000000000000000000000011100000
.
在步骤4中,当它被转换为时int
,最高有效位是0
.
为什么,当我使用说明%hd
符甚至是%d
说明符时,它仍会提示我输入负值而不是正值?
不,short和int都是签名类型,因此它通过符号扩展而不是0字节填充来提升:
-32 short = 11111111 11100000
-32 int = 11111111 11111111 11111111 11100000
Run Code Online (Sandbox Code Playgroud)
将MSB保持为1,即为负.
你可以先伪装无符号来伪造你期望的行为,例如
printf("%d", (unsigned short)((short)(-32)));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
667 次 |
最近记录: |