有符号整数溢出:999999999 * 10 无法用“int”类型表示错误

Kha*_*dam 6 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;
 }
Run Code Online (Sandbox Code Playgroud)

错误:

Credit.c:25:25:运行时错误:有符号整数溢出:999999999 * 10 无法以“int”类型表示

Tot*_*Zam 2

您的代码有(两个)主要问题,它们都会导致相同的错误:
intlength变量被增加到达到最大值的点。

这是你的 while 循环:

while (NUM > range1)
{
    long long range2 = range1 * 10 + 9;
    length += 1;
}
Run Code Online (Sandbox Code Playgroud)

问题#1

最大的问题是这个 while 循环永远不会结束。您永远不会更改while 循环中NUM或的值,因此如果开始时大于,您将陷入无限循环。将继续被调用,直到整数达到允许的最大 int 值。range1NUMrange1length += 1length

(可能)问题#2

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

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

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

如果您的循环设置为运行次数值,NUM直到达到 9。如果我们选择尽可能低的 16 位信用卡号码 1000000000000000,您的循环仍将运行1000000000000000 - 9次数。

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

(可能)修复

您的问题中没有足够的详细信息,无法确定这是否能解决您的问题,但我猜测,而不是

long long range2 = range1 * 10 + 9;
Run Code Online (Sandbox Code Playgroud)

你可能想写

range1 = range1 * 10 + 9;
Run Code Online (Sandbox Code Playgroud)