#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;
}

output:

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

在本例中,为什么d打印32位而不是b

推荐答案

当小于int的类型(例如,通常是int16_t)被传递给像printf这样的vararg函数时,它是promotedint.

此促销包括sign extension,因此负数仍然是相同的负数.

而使用two's complement系统时,当高位被设置时,表示负数.因此,例如0xf8ff将被提升为0xfffff8ff.

这就是这里发生的事情.

要将int16_t打印为十六进制,请使用<inttypes.h>中的PRIx16宏:

printf("d = %" PRIx16 "\n", d);

C++相关问答推荐

如何将一个enum类型类型转换为另一个类型?

括号中的堆栈实现错误问题

模拟shell并运行.sh文件

在 struct 中强制转换空指针

函数内的局部字符指针

struct -未知大小

错误:包含文件时类型名称未知

在libwget中启用Cookie会导致分段故障

在编写代码时,Clion比vscode有更多的问题指示器

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

C语言中奇怪的输出打印数组

静态初始化顺序失败是否适用于C语言?

C编译和运行

unions 的原子成员是个好主意吗?

C中的char**v*char[]

atoi函数最大长-长误差的再创造

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

如何用用户输入的多个字符串填充数组?

设置具有非零终止字符串的大整数