有符号整数溢出:999999999 * 10不能用'int'类型表示错误

时间:2016-12-06 03:02:21

标签: c integer-overflow cs50

为什么会出现运行时错误?我把range2做了很长时间。

代码:

/*VARIABLES FOR WHILE LOOP*/
 long long range1 = 9;
 int length = 1;

 /*FIND NUM'S LENGTH*/
 while (NUM > range1)     
 {
    long long range2 = range1 * 10 + 9;
    length += 1;
 }

错误:

  

credit.c:25:25:运行时错误:有符号整数溢出:999999999 * 10无法用'int'类型表示

3 个答案:

答案 0 :(得分:1)

您的代码存在(两个)主要问题,这两个问题都会导致相同的错误:
int length变量正在增加到达到最大值的位置。

这是你的循环:

while (NUM > range1)
{
    long long range2 = range1 * 10 + 9;
    length += 1;
}

问题#1

这个最大的问题是这个while循环永远不会结束。您永远不会在while循环中更改NUMrange1的值,因此如果NUM的开头大于range1,您将陷入无限循环。在length += 1整数达到max allowed int值之前,length将一直被调用。

(可能)问题#2

根据您解决问题#1的方式,您还可能遇到以下问题。

正如您在上述评论中所述,NUM是信用卡号。

  • 默认为信用卡号码 16位数。
  • int变量的最大值是999999999 * 10,最多10位数。

如果你的循环被设置为运行NUM次的值,直到它达到9.如果我们假设选择尽可能低的16位信用卡号码1000000000000000,你的循环仍然会运行{{1} }次。

每次循环运行时,1000000000000000 - 9增加1.循环基本上会尝试将int变量增加至少999999999999991次,这将导致该值大于999999999 * 10.

(可能)修复

在您的问题中没有足够的细节来确定这是否可以解决您的问题,但我会猜测而不是

length
你可能想写

long long range2 = range1 * 10 + 9;

答案 1 :(得分:1)

您可以尝试使用此方法来满足上述条件

使用两种最常见的表示形式,范围是0到4,294,967,295(2 ^ 32-1)以表示为一个(无符号)二进制数,范围是-2,147,483,648(-2 ^ 31)到2,147,483,647(2 ^ 31 − 1)表示为二进制补码

我最近在解决一个有约束的问题时遇到了它

  

给出一个32位带符号整数,整数的倒数

运行时错误:有符号整数溢出:999999999 * 10不能用'int'类型表示

所以,这是我的代码

    while (x != 0) {
        int pop = x % 10;
        x /= 10;
        if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
        if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
        rev = rev * 10 + pop;
    }

在我获得999999999 * 10之前,rev> INT_MAX它保证了溢出,反之亦然。

答案 2 :(得分:-1)

unsigned int 的大小为(0 到 4,294,967,295)4 个字节;
所以 999999999 *10 大于 4,294,967,295 因此尝试使用 (long)

long long int x=999999999 *10   (try this...)