这是我的计划:
#include <stdio.h>
int main()
{
int a=0x09;
int b=0x10;
unsigned long long c=0x123456;
printf("%x %llx\n",a,b,c);//in "%llx", l is lowercase of 'L', not digit 1
return 0;
}
输出是:
9 12345600000010
我想知道:
请帮助我并以此程序为例进行解释。
答案 0 :(得分:2)
问题是您的类型不匹配。这是未定义的行为。
您的第二个参数b
与格式的类型不匹配。所以发生的事情是printf()
正在读取超过4个字节的b(printf
期望一个8字节的操作数,但b
只有4个字节)。所以你得到了垃圾。由于您的printf()
只有2个格式代码,因此根本不打印第3个参数。
由于参数通常在内存中连续(和相邻)传递,printf()
正在读取的4个额外字节实际上是c
的低4字节。
所以最后,正在打印的第二个数字等于b + ((c & 0xffffffff) << 32)
。
但我想重申一下: 此行为未定义 。只是今天大多数系统的行为都是这样的。
答案 1 :(得分:1)
如果传递给printf
的参数与格式规范不匹配,则会得到未定义的行为。这意味着任何事情都可能发生,您无法推断您在特定系统上看到的结果。
在您的情况下,%llx
需要unsigned long long
类型的参数,但您提供了int
。仅这一点就会导致不确定的行为。
将更多参数传递给printf
并不是错误,而不是格式说明符,超出的参数会被计算但会被忽略。
答案 2 :(得分:0)
printf()
根据格式增加指针一次读取一个参数。如果格式化参数的数量大于参数的数量,则printf()将从未知的内存位置输出数据。但是,如果参数的数量大于格式化参数的数量,则不会造成任何损害。例如。如果格式化参数和参数的数量不匹配,gcc将发出警告。