溢出产品的整数

fud*_*din 2 c overflow

在下面的代码中,prod的值不是9,000,000; 它获得了垃圾值.为什么我们需要num1和num2为long类型?

#include <stdio.h>
int main()
{
    int num1 = 3000, num2 = 3000;
    long int prod = num1 * num2;
    printf("%ld\n", prod);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

who*_*ops 9

当计算num1*num2时,它存储在一个相同类型的中间变量(即一个int)中,它变成了垃圾,因为它不够大.然后,中间变量存储在long int中,但计算出的答案已经变成了垃圾.

解决方案是抛出乘法的一个参数.

long int prod = (long int)num1 * num2;
Run Code Online (Sandbox Code Playgroud)

这样,中间计算将使用两种类型中较大的一种,并将其临时存储为long int.

  • @Steven:当`unsigned ints`"溢出"时,它们不会导致UB; 它们回绕到0(它们运行`MOD(UINT_MAX + 1)`). (4认同)
  • 注意:带有整数的溢出(和下溢)会导致**未定义的行为**.不惜一切代价避免:使用`unsigned ints`(没有UB,但可能出现错误的结果)或在**发生之前检查溢出**. (2认同)
  • 签名溢出的不确定性不仅仅是遗留的非二进制补充机器的一些理论问题或奇怪之处.现代gcc使用了有符号溢出是UB以更好地优化的事实 - 它假定编码器已经确保作为算术中使用的任何有符号值不会导致溢出的前提条件. (2认同)