【发布时间】:2015-09-04 11:14:30
【问题描述】:
请考虑下面的程序并观察输出。
#include <stdio.h>
int main()
{
unsigned long long val ;
val =144111444250;
printf ("%llu\n", val);
printf ("%u %llu\n",val, val);
return 0;
}
输出:
144111444250
33 10211385600662044705
在第一个 printf 中使用 %llu 会得到正确的结果,但在第二个 printf 中使用 %llu 会得到错误的结果。
【问题讨论】:
-
您的编译器应该警告您将
%u与long long unsigned类型一起使用。 -
%u仅从堆栈中弹出val的一部分。之后,%llu弹出sizeof(unsigned long long)字节,其中包括第一次尝试打印val的其余部分。将%u替换为%llu时,您的程序应该可以正常工作。 -
您使用了无效的说明符并得到了无效的结果。谁感到惊讶?
-
@BoPersson:在第一个 printf 中使用 %llu 会给出正确的结果,但在第二个 printf 中使用 %llu 会给出错误的结果。这就是我的问题所在
-
@SHAAN - 但这是错误的第一种格式
%u。就像答案已经说过的那样 - 一旦出现问题,其他一切也可能出现问题。