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

C sizeof(long-long)给出8,但数字在2**32处溢出,c,overflow,long-integer,C,Overflow,Long Integer,结果显然是人满为患。但我不明白为什么这会发生在朗朗身上。sizeofint返回4个[字节],但结果相同。我做错了什么?您必须使用正确的说明符。%d说明符需要一个int,而您传递了一个long int。根据标准,这将调用未定义的行为。观察到的行为可能是可以解释的,但这并不意味着它不是严格未定义的行为 像这样修复代码 $ 1932053504 $ 8 它应该按预期的那样工作 注意:启用编译警告,您应该很快发现此类错误 结果显然是人满为患 这是一个错误的结论。您将得到一个截断的结果 当我跑步时: p

结果显然是人满为患。但我不明白为什么这会发生在朗朗身上。sizeofint返回4个[字节],但结果相同。我做错了什么?

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

像这样修复代码

$ 1932053504
$ 8
它应该按预期的那样工作

注意:启用编译警告,您应该很快发现此类错误

结果显然是人满为患

这是一个错误的结论。您将得到一个截断的结果

当我跑步时:

printf("%lld\n", prod);
printf("%zu\n", sizeof(long long)); 
截断是由于使用了%d格式说明符而发生的

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

1932053504
1932053504

为什么结果会溢出?因为使用python:math.factorial13-2**32==193205350请阅读我的答案。在gcc上启用编译器警告-Wall并做一些事情来修复它们。啊,好的,谢谢。但是您能解释一下为什么在解决方案中使用两个不同的说明符吗?因为sizeof会给出一个需要%zu说明符的size\t。它不是一个长整型。您必须对说明符和传递的类型非常严格,因为没有其他方法来保证类型安全。这是有意义的。谢谢
1932053504
1932053504
   printf("%lld\n", prod);