C程序Printf函数显示unsigned long long类型的异常行为?

Sha*_*ain -1 c unix printf solaris

请考虑以下程序并观察输出.

#include <stdio.h>
int main()
{
    unsigned long long val ;
    val =144111444250;
    printf ("%llu\n", val);
    printf ("%u %llu\n",val, val);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

   144111444250

   33 10211385600662044705
Run Code Online (Sandbox Code Playgroud)

在第一个printf中使用%llu会得到正确的结果,但在第二个printf中使用%llu会得到错误的结果.

Kni*_*nug 6

这是未定义的行为:printf期望一个unsigned intfor %u但是你提供了一个unsigned long long int,在此之后发生的任何事情都取决于编译器的奇思妙想.

该格式说明printf,并scanf不仅预示着什么应如何打印/扫描,还能有什么样的参数的期望.如果你撒谎,你不能指望结果是合理的.