我尝试在程序中打印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
中的正确数字。
感谢您提前提供任何帮助。
答案 0 :(得分:7)
printf
是一个可变函数,它不知道它的参数类型,它依赖于在格式字符串中接收正确的提示。
您使用"%lld"
调用了未定义的行为,因为您尚未通过long long int
。
要修复它,你需要施放 - 然后你会看到正确的结果:
printf("%lld", (long long int) INT_MAX);
启用编译器警告? :)
答案 1 :(得分:6)
%lld
是int
的错误规范。根据标准,它是未定义的行为:
7.21.6.1
fprintf
功能...
如果有任何论据 不是相应转换规范的正确类型,行为是 未定义。
7.21.6.3
printf
功能...
printf
功能相当于fprintf
,参数stdout
在printf
的参数之前。
答案 2 :(得分:5)
在调用函数时将4个字节的数据(int-length)压入堆栈,然后告诉函数从调用堆栈中消耗8个字节来打印它。所以你的价值落后于4个字节的垃圾。
您可以告诉编译器检查这个。