代码之家  ›  专栏  ›  技术社区  ›  Sreeraj Chundayil

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

  •  1
  • Sreeraj Chundayil  · 技术社区  · 2 年前
    #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 打印32位 b ?

    1 回复  |  直到 2 年前
        1
  •  6
  •   Some programmer dude    2 年前

    当类型小于 int (例如。 int16_t 通常是)传递给vararg函数 printf ,它是 promoted int

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

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

    这就是这里发生的事情。

    打印 int16_t 作为十六进制,使用 PRIx16 宏来自 <inttypes.h> :

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