为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

问题描述 投票:0回答:1
#include <stdio.h>
#include <stdint.h>

int main()
{
  uint32_t a = 0xF0FF1FFF;
  printf("a = 0x%x\n",a);
  uint16_t b = a;
  printf("b = 0x%x\n",b);


  int32_t c = 0xF0FF8FFF;
  printf("c = 0x%x\n",c);
  int16_t d = c;
  printf("d = 0x%x\n",d);

  int32_t e = d;
  printf("e = 0x%x\n",e);

  return 0;
}

输出:

a = 0xf0ff1fff
b = 0x1fff
c = 0xf0ff8fff
d = 0xffff8fff
e = 0xffff8fff

在此示例中,为什么

d
b
不同,打印 32 位?

c type-conversion
1个回答
0
投票

当小于

int
的类型(例如通常是
int16_t
)被传递给像
printf
这样的 vararg 函数时,它会被 提升
int

此促销活动包括符号扩展,因此负数仍然是相同的负数。

并且使用二进制补码系统,当设置高位时,表示负数。所以例如

0xf8ff
将提升为
0xfffff8ff

这就是这里发生的事情。

© www.soinside.com 2019 - 2024. All rights reserved.