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)
它不知道.在这两种情况下,由于默认参数促销,您都会给出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位.