函数实现c = a + b

时间:2022-07-22 19:14:35
int a, b, c 请写函数实现C= a+b;不可以改变数据类型,如将c改为long int,关键是如何处理溢出问题
bool add(int a, int b, int *c)
{
    *c = a+b;
    return (a>0 && b>0 && (*c<a||*c<b) || (a<0 && b<0 && (*c>a || *c>b)));
}

这是一道面试题,以及答案。
看了一会,没有看懂,能帮忙解释一下吗?

7 个解决方案

#1


x86架构的CPU处理加减法的溢出是这样的:

例如char类型表示的数据范围是-128 — 127,那么127+2=-127,-127-2=127
lz的程序在计算和的同时判断运算中是否有溢出发生。

#2


两个int数相加,只有两个数的符号相同的时候才会溢出:
1,两个正数相加;
a>0 && b>0 就是判断两数都是正数;如果没有溢出,则和b必定大于a、b,反之溢出;
2,两负数相加;
a<0 && b<0 判断两数都是负数;如果没有溢出,则和b必定小于a、b,反之溢出;

综合起来就是:
return (a>0 && b>0 && (*c<a||*c<b) || (a<0 && b<0 && (*c>a || *c>b)));

#3


则和b==>则和*c

#4


bool add(int a, int b, int *c)
{
    *c = a+b;
    return (a>0 && b>0 && (*c<a||*c<b) //两个有符号正数相加,可能超出有符号数表
//示的范围,即占用了符号位,表现出来是个负数,所以另一种写法是这样的
//a>0 && b>0 && *c<0
//比如char a=100,b=100;char c=a+b;后c的内存位是:11001000,按char解释是-56
       || (a<0 && b<0 && (*c>a || *c>b)));
}

#5


确实挺有意思的。
蛮好的程序。虽然确实挺简单的,不过平时写的时候没注意过这个问题(也没必要)。
不过,还是感谢楼主。

#6


这样写不是更清楚吗?

if(a > 0 && b > 0)           // 如 a,b 为正数, 沒溢出时 c 必比 a 或 b 大
  return *c > a;
else if(a < 0 && b < 0)      // 如 a, b 为负数, 沒溢出时 c 必比 a 或 b 小
  return *c < a;
else                         // a 或 b = 0 或 a, b 为正负各一
  return true;

#7


楼上的确实简单明了

#1


x86架构的CPU处理加减法的溢出是这样的:

例如char类型表示的数据范围是-128 — 127,那么127+2=-127,-127-2=127
lz的程序在计算和的同时判断运算中是否有溢出发生。

#2


两个int数相加,只有两个数的符号相同的时候才会溢出:
1,两个正数相加;
a>0 && b>0 就是判断两数都是正数;如果没有溢出,则和b必定大于a、b,反之溢出;
2,两负数相加;
a<0 && b<0 判断两数都是负数;如果没有溢出,则和b必定小于a、b,反之溢出;

综合起来就是:
return (a>0 && b>0 && (*c<a||*c<b) || (a<0 && b<0 && (*c>a || *c>b)));

#3


则和b==>则和*c

#4


bool add(int a, int b, int *c)
{
    *c = a+b;
    return (a>0 && b>0 && (*c<a||*c<b) //两个有符号正数相加,可能超出有符号数表
//示的范围,即占用了符号位,表现出来是个负数,所以另一种写法是这样的
//a>0 && b>0 && *c<0
//比如char a=100,b=100;char c=a+b;后c的内存位是:11001000,按char解释是-56
       || (a<0 && b<0 && (*c>a || *c>b)));
}

#5


确实挺有意思的。
蛮好的程序。虽然确实挺简单的,不过平时写的时候没注意过这个问题(也没必要)。
不过,还是感谢楼主。

#6


这样写不是更清楚吗?

if(a > 0 && b > 0)           // 如 a,b 为正数, 沒溢出时 c 必比 a 或 b 大
  return *c > a;
else if(a < 0 && b < 0)      // 如 a, b 为负数, 沒溢出时 c 必比 a 或 b 小
  return *c < a;
else                         // a 或 b = 0 或 a, b 为正负各一
  return true;

#7


楼上的确实简单明了