C 有符号整数溢出:99999999*10不能在类型';int';错误

C 有符号整数溢出:99999999*10不能在类型';int';错误,c,integer-overflow,cs50,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:运行时错误:有符号整数

为什么会出现运行时错误?我把
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”中表示

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

这是您的while循环:

while (NUM > range1)
{
    long long range2 = range1 * 10 + 9;
    length += 1;
}
问题1 最大的问题是这个while循环永远不会结束。您永远不会更改while循环中
NUM
range1
的值,因此如果
NUM
开始时大于
range1
,您将陷入无限循环
length+=1
将一直被调用,直到
length
整数达到允许的最大int值

(可能)问题#2 根据您如何解决问题1,您还可以面临以下问题

正如您在上面的评论中所述,
NUM
是一个信用卡号码

  • 默认情况下,信用卡号为 16位长
  • int
    变量的最大值为99999999* 10,最多10位
如果将循环设置为运行
NUM
次,直到达到9。如果我们选择尽可能低的16位信用卡号10000000000000,您的循环仍将运行
10000000000000-9次

每次循环运行时,
长度增加1。循环基本上会尝试将int变量增加至少9999999999999 1倍,这将导致该值大于99999999*10

(可能)修复 在你的问题中没有足够的细节来确定这是否能解决你的问题,但我猜这不是问题的答案

long long range2 = range1 * 10 + 9;
你可能是想写信

range1 = range1 * 10 + 9;

您可以尝试使用此方法来处理上述情况

使用两种最常见的表示法,范围为0到4294967295(2^32− 1) 表示为(无符号)二进制数,以及−2,147,483,648 (−2^31)至2147483647(2^31− 1) 表示为二的补码

我最近在解决一个有限制的问题时遇到了这个问题

给定一个32位有符号整数,整数的倒数

运行时错误:有符号整数溢出:99999999*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;
    }
while(x!=0){
int-pop=x%10;
x/=10;
如果(rev>INT_MAX/10 | |(rev==INT_MAX/10&&pop>7))返回0;
if(rev

在我得到999999999*10之前,rev>INT\u MAX它保证了溢出,反之亦然。

length+=1
-可以得到多大?我希望限制为NUM的长度(用户输入的信用卡号)。您使用的编译器是什么
99999999*10
太大,无法存储在
signed int
中,但由于
range1
signed long
,它应该足够了。请尝试将
10
更改为
10LL
@moswald:我正在使用cs50的IDE。我使用了'LL',但它仍然给出了错误。长度仅增加到NUM的长度(位数)。我的循环应该查找NUM的位数。@KhalidMukadam这不是你的循环当前所做的。要明确的是,如果你的NUM是16位,那么长度应该是16位还是
16-range1
而只有5位?@KhalidMukadam Problem#1解释了为什么会出现运行时错误,本质上回答了你的问题。您的代码似乎比您在问题中指出的问题更多。如果您正在寻找查找字符串长度的正确方法,请查看: