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

sizeof(long long) gives 8 but number overflows at 2**32

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

returns

$ 1932053504
$ 8

结果显然溢出了。但我不明白为什么 long long 会发生这种情况。 sizeof(int) returns 4 [bytes] 但产品是一样的。我做错了什么?

您必须使用正确的说明符。 "%d" 说明符需要一个 int 而你传递了一个 long long int。根据 标准,这将调用未定义的行为。观察到的行为可能是可以解释的,但这并不意味着它不是严格意义上的 未定义行为

像这样修复代码

printf("%lld\n", prod);
printf("%zu\n", sizeof(long long)); 

它应该会按预期工作。

注意:启用编译警告,你应该很快发现这种错误。

Result is clearly overflowing.

这是一个错误的结论。你得到了一个 t运行 的结果。

当我运行:

#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 格式说明符,t运行 发生了。

您可以使用正确的格式说明符来解决这个问题。

   printf("%lld\n", prod);