有符号整数溢出: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
中,但由于 range1
是 signed 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 循环中更改 NUM
或 range1
的值,因此如果 NUM
开始时大于 range1
,您将陷入无限循环。 length += 1
将继续被调用,直到 length
整数达到最大允许的 int 值。
(可能的)问题 #2
根据您解决问题 #1 的方式,您还可能面临以下问题。
正如您在上面的评论中所说,NUM
是信用卡号。
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”类型表示