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位长
- 和
变量的最大值为99999999* 10,最多10位int
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解释了为什么会出现运行时错误,本质上回答了你的问题。您的代码似乎比您在问题中指出的问题更多。如果您正在寻找查找字符串长度的正确方法,请查看: