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

car*_*995 5 c int types short

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

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

  2. 所以基本上short类型是16位宽,也就是0000000000000000同时int的类型是32位宽,这是00000000000000000000000000000000.

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

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

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

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

Rup*_*Rup 9

不,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)

  • +1:在2的补码中,这是绝对正确的.对于其他表示,将发生等效的事情. (3认同)
  • Oli所说的 - 准确地说,从"short"推广到"int"时,数字的真正数学值得以保留.在2的补码和1的补码中,这意味着符号扩展.在符号幅度中,它表示符号位右侧的零填充. (3认同)

Ric*_*der 2

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