C printf函数如何知道传递的整数大小?

Moh*_*bil 1 c printf pointers variadic-functions

在下面的示例代码中,printf如何知道uint8_t应该打印的大小,而上述格式只是"0x%x"而passd类型是uint32_t?printf怎么知道在第一次调用时它必须打印4个字节而第二个调用它必须只打印1个字节?

uint32_t X = 0xAABBCCDD;
printf("uint32_t 0x%x\n", (uint32_t) X);
printf("uint8_t  0x%x\n", (uint8_t) X);
Run Code Online (Sandbox Code Playgroud)

产量

uint32_t 0xaabbccdd
uint8_t  0xdd
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 7

它不知道.在这两种情况下,由于默认参数促销,您都会给出printf一个.您的代码等同于:1[unsigned] int

printf("uint32_t 0x%x\n", (unsigned int)(uint32_t) X);
printf("uint8_t  0x%x\n", (int)(uint8_t) X);
Run Code Online (Sandbox Code Playgroud)

促销规则是:

[6.3.1.1]如果a int表示原始类型的所有值[...],则该值将转换为int; 否则,它被转换为unsigned int.

此时唯一的规则printf是不打印前导零.

请注意,将签名映射int到%x技术上是未定义的行为.


我假设你int在这里有32位.

  • `uint8_t`默认提升为`int`,而不是`unsigned int`,因为提升是值保留的,而`uint8_t`的范围总是适合`int`而不需要去`unsigned int`. (2认同)