C语言 有符号整数溢出:999999999 * 10无法在类型'int'中表示错误

qcuzuvrc  于 2023-04-05  发布在  其他
关注(0)|答案(4)|浏览(218)

为什么会出现运行时错误?我把range2设置为long long。

代码:

/*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;
 }

错误:

信用卡.c:25:25:运行时错误:有符号整数溢出:999999999 * 10不能用类型“int”表示

k3fezbri

k3fezbri1#

你可以试试这一款来处理以上情况

  • 对于两种最常见的表示法,表示为(无符号)二进制数的范围是0到4,294,967,295(2^32 − 1),表示为2的补码的范围是-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;
    }

在我得到99999999 *10,rev〉INT_MAX之前,它保证了OVERFLOW,反之亦然。

rkue9o1l

rkue9o1l2#

你的代码有两个主要问题,这两个问题都会导致相同的错误:
int length变量将增加到它达到最大值的点。
下面是while循环:

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

问题#1

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

(可能)问题#2

根据您解决问题#1的方式,您还可能面临以下问题。
正如你在上面的评论中所说,NUM是一个信用卡号码。

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

如果你的循环被设置为运行NUM次,直到它达到9。如果我们假设选择最低的16位信用卡号码,10000000000000,你的循环仍然会运行1000000000000000 - 9次。
每次循环运行时,length都会增加1。循环将尝试将int变量增加至少999999999999991次,这将导致值大于999999999 * 10。

(可能)修复

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

long long range2 = range1 * 10 + 9;

你可能是想写

range1 = range1 * 10 + 9;
5ktev3wc

5ktev3wc3#

你必须仔细阅读这个问题,因为在一些问题中,输入/输出是有符号的32位整数或无符号的32位整数,两者都有不同的范围,因此范围之外的值无效,或者你必须返回0,就像下面一样。返回x的数字反转。如果反转x导致值超出有符号32位整数范围[-231,231 - 1],则返回0。
假设环境不允许存储64位整数(有符号或无符号)。Solution

4xy9mtcn

4xy9mtcn4#

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

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

相关问题