函数实现c = a + b

haha168_2002 2006-07-14 03:46:07
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)));
}

这是一道面试题,以及答案。
看了一会,没有看懂,能帮忙解释一下吗?
...全文
777 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cambridgeboy 2006-07-14
  • 打赏
  • 举报
回复
楼上的确实简单明了
ddstudent 2006-07-14
  • 打赏
  • 举报
回复 1
这样写不是更清楚吗?

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;
yuyuan830705 2006-07-14
  • 打赏
  • 举报
回复
确实挺有意思的。
蛮好的程序。虽然确实挺简单的,不过平时写的时候没注意过这个问题(也没必要)。
不过,还是感谢楼主。
0黄瓜0 2006-07-14
  • 打赏
  • 举报
回复
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)));
}
tailzhou 2006-07-14
  • 打赏
  • 举报
回复
则和b==>则和*c
tailzhou 2006-07-14
  • 打赏
  • 举报
回复 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)));
littlefish1981 2006-07-14
  • 打赏
  • 举报
回复
x86架构的CPU处理加减法的溢出是这样的:

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

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧