#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 位?
当小于
int
的类型(例如通常是 int16_t
)被传递给像 printf
这样的 vararg 函数时,它会被 提升 为 int
。
此促销活动包括符号扩展,因此负数仍然是相同的负数。
并且使用二进制补码系统,当设置高位时,表示负数。所以例如
0xf8ff
将提升为0xfffff8ff
。
这就是这里发生的事情。