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
。根据 c 标准,这将调用未定义的行为。观察到的行为可能是可以解释的,但这并不意味着它不是严格意义上的 未定义行为。
像这样修复代码
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);
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
。根据 c 标准,这将调用未定义的行为。观察到的行为可能是可以解释的,但这并不意味着它不是严格意义上的 未定义行为。
像这样修复代码
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);