gpt4 book ai didi

c - C 中带乘法的整数溢出

转载 作者:太空宇宙 更新时间:2023-11-04 07:50:14 25 4
gpt4 key购买 nike

我最近一直在和 C 打交道,接触到了整数重载的概念。我正在尝试创建一个程序来检测两个 32 位整数相乘后是否能够放入另一个 32 位整数。

我了解整数溢出的概念以及整数最终溢出的原因,但我仍然无法弄清楚该程序的逻辑。这是我到目前为止所拥有的:

int main() {    
int min = INT_MIN;
int max = INT_MAX;

int num1, num2;
int x = num1 * num2;

printf("Please enter a number you would like to multiply: ");
scanf("%d", &num1);
printf("\nPlease enter a second number you would like to multiply: ");
scanf("%d", &num2);

if (num1 > max / num2){
printf("\nOverflow! - first case\n");
}
else if (num2 > max / num1){
printf("\nOverflow! - second case\n");
}
else if ((num1 > max - num2 && num2 > 0 ) ||
(num1 < max - num2 && num2 < 0)){

printf("\nOverflow! - third case\n");
}
else
printf("\nNot Overflow!\n");

return 0;
}

如您所见,我的程序可以检测到某些溢出情况,但其他几种情况(例如 -2 * 3 和 -2 * -3)会被我的条件捕获。

所以我有的绝对不行。解决这个问题的好方法是什么?

最佳答案

a*b > INT_MAX 时整数溢出或者当 a*b < INT_MIN .

这导致不等式:

如果b > 0 : a > INT_MAX/ba < INT_MIN/b
如果b < 0 : a < INT_MAX/ba > INT_MIN/b

所以如果 int 输出的条件溢出是:

b>0 && (a>INT_MAX/b || a<INT_MIN/b) || b<0 && (a<INT_MAX/b || a>INT_MIN/b)

自此INT_MIN/b可能会溢出自身(当 b=-1 时)这应该单独检查。

这是一个相当长的条件,也许应该拆分并放入一个函数中:

int ismultoverflow(int a, int b)
{
if(b > 0)
{
if(a>INT_MAX/b || a<INT_MIN/b)
{
return 1;
}
}
else if(b < 0)
{
if(b == -1)
{
return a==INT_MIN;
}

if(a<INT_MAX/b || a>INT_MIN/b)
{
return 1;
}
}

return 0;
}

另一种方法是将不等式分为四个域而不是两个:

如果a > 0b > 0 : a > INT_MAX/b
如果a > 0b < 0 : b < INT_MIN/a
如果a < 0b > 0 : a < INT_MIN/b
如果a < 0b < 0 : b < INT_MAX/a

这会导致您不必处理特殊情况的功能:

int ismultoverflow(int a, int b)
{
if(a>0 && b>0 && a>INT_MAX/b)
{
return 1;
}
if(a>0 && b<0 && b<INT_MIN/a)
{
return 1;
}
if(a<0 && b>0 && a<INT_MIN/b)
{
return 1;
}
if(a<0 && b<0 && b<INT_MAX/a)
{
return 1;
}

return 0;
}

当然,如果您可以使用宽度更大的类型,它就会变得不那么复杂(不能保证 longlong longint 宽,但在许多平台上都是这种情况):

int ismultoverflow(int a, int b)
{
long x=a, y=b;

if(x*y > INT_MAX || x*y < INT_MIN)
{
return 1;
}

return 0;
}

关于c - C 中带乘法的整数溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54318815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com