2

我尝试打印程序中的最大值int。使用以下代码::

#include <stdio.h>
#include <limits.h>
int main(void) {
    printf("%d",INT_MAX);
    return 0;
}

我得到的输出是::2147483647

但是,当我将我的printf语句更改为printf("%lld",INT_MAX);我的输出时,就会变成577732524332023807. INT_MAX值应该在的范围内long long int,那为什么它不能转换INT_MAX成正确的数字long long int

感谢您提前提供任何帮助。

4

3 回答 3

7

printf是一个可变参数函数,它不知道它的参数类型,它依赖于接收格式字符串中的正确提示。

您使用 调用了未定义的行为"%lld",因为您没有通过long long int.

要修复它,您需要强制转换 - 然后您会看到正确的结果:

printf("%lld", (long long int) INT_MAX);

启用编译器警告?:)

于 2014-10-05T20:33:59.490 回答
6

%lld是不正确的规范int。根据标准,这是未定义的行为:

7.21.6.1fprintf功能

……

如果任何参数不是相应转换规范的正确类型,则行为未定义。


7.21.6.3printf功能

……

printf函数等效于fprintf在 的参数stdout之前插入参数printf

于 2014-10-05T20:32:11.043 回答
5

您在调用函数时将 4 个字节的数据(int-length)压入堆栈,然后告诉函数从调用堆栈中消耗 8 个字节来打印它。所以你的值后面跟着 4 个字节的垃圾。

您可以告诉编译器检查这一点。

于 2014-10-05T20:35:27.780 回答