long long n, prod, i;
n = 13;
prod = 1;
for (i = 1 ; i <= n ; i++) {
prod *= i;
}
printf("%d\n", prod);
printf("%d\n", sizeof(long long));
返回
$ 1932053504
$ 8
结果显然已经溢出。但我不明白为什么long long
会发生这种情况。 sizeof(int)
返回4 [字节],但产品是相同的。我做错了什么?
答案 0 :(得分:6)
您必须使用正确的说明符。 "%d"
说明符需要int
并且您传递了long long int
。根据{{3}}标准,这将调用未定义的行为。观察到的行为可能是可解释的,但这并不意味着它不是严格未定义的行为。
修复像这样的代码
printf("%lld\n", prod);
printf("%zu\n", sizeof(long long));
它应该按预期工作。
注意:启用编译警告,你应该很快发现这种错误。
答案 1 :(得分:2)
结果显然已经过时了。
这是一个错误的结论。你得到了截断的结果。
当我跑步时:
#include <stdio.h>
int main()
{
long long n, prod, i;
n = 13;
prod = 1;
for (i = 1 ; i <= n ; i++) {
prod *= i;
}
int truncated_value = prod;
printf("%d\n", prod);
printf("%d\n", truncated_value);
}
我得到了
1932053504
1932053504
由于使用%d
格式说明符而发生截断。
您可以使用正确的格式说明符来解决这个问题。
printf("%lld\n", prod);