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的程序在计算和的同时判断运算中是否有溢出发生。
例如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)));
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)));
}
{
*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;
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的程序在计算和的同时判断运算中是否有溢出发生。
例如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)));
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)));
}
{
*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;
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
楼上的确实简单明了