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

Posted

技术标签:

【中文标题】有符号整数溢出:999999999 * 10 不能用“int”类型表示错误【英文标题】:Signed integer overflow: 999999999 * 10 cannot be represented in type 'int' Error 【发布时间】:2016-12-06 03:02:20 【问题描述】:

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

【问题讨论】:

length += 1 - 能有多大? 我希望限制为 NUM(用户输入的信用卡号)的长度。 你用的是什么编译器? 999999999 * 10 太大而无法存储在 signed int 中,但由于 range1signed long long,它应该足够了。 尝试将 10 更改为 10LL @moswald:我正在使用 cs50 的 IDE。我使用了“LL”,但仍然报错。 【参考方案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】:

您的代码存在(两个)主要问题,它们都会导致相同的错误: 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变量的最大值是999999999 * 10,最多 10 位数字。

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

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

(可能)修复

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

long long range2 = range1 * 10 + 9;

你可能打算写

range1 = range1 * 10 + 9;

【讨论】:

长度仅增加到 NUM 的长度(位数)。我的循环应该找到 NUM 的位数。 @KhalidMukadam 这不是您的循环当前所做的。需要明确的是,如果假设您的 NUM 长度为 16 位,那么长度应该以 16 结尾还是应该是 16 - range1 并且只有 5? @KhalidMukadam 问题 #1 解释了为什么您会遇到运行时错误,并且本质上回答了您的问题。您的代码似乎比您在问题中指出的问题更多。如果您正在寻找查找字符串长度的正确方法,请查看:***.com/questions/2070566/…【参考方案3】:

无符号整数的大小为(0 到 4,294,967,295),共 4 个字节; 所以 999999999 *10 大于 4,294,967,295 因此尝试使用 (long)

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

【讨论】:

以上是关于有符号整数溢出:999999999 * 10 不能用“int”类型表示错误的主要内容,如果未能解决你的问题,请参考以下文章

运行时错误:有符号整数溢出:2147483647 + 1 不能以“int”类型表示

如何提高C语言代码质量?

如何在 Rust 中将有符号整数添加到无符号整数,检查无符号溢出?

7. 整数反转

C99 标准在哪里说有符号整数溢出是未定义的行为?

整数溢出实验