sizeof(long long)给出8但是数字溢出2 ** 32

时间:2016-05-18 21:56:30

标签: c overflow long-integer

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 [字节],但产品是相同的。我做错了什么?

2 个答案:

答案 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);