有符号数,取绝对值后再赋值给有符号数,会有bug吗?

2020-01-21 21:30发布

int ia,ib;
long la;
..........
ia = abs(ia);
ib = abs(ib);
la= ia+ib;
........

本意是要得到 ia与ib的绝对值之和,这样能得到正确的结果吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
xiaolaba
1楼-- · 2020-01-23 08:49
多放一個 unsign 存你的 ABS 結果, 最高位始終是0
wistarky
2楼-- · 2020-01-23 14:19


la= ia+ib;

改成
la = ia;
la += ib;

ia+ib比int最大正值大的时候会溢位,这时不是用long运算。
liuchg
3楼-- · 2020-01-23 19:23
如果这样呢

int ia,ib;
unsigned int ua,bu;
long la;
..........
ua = abs(ia);
ub = abs(ib);
la= ua+ub;
........
扬帆远航
4楼-- · 2020-01-23 20:01
同意15L的说法..
小行星
5楼-- · 2020-01-23 22:10
 精彩回答 2  元偷偷看……
v灰尘
6楼-- · 2020-01-23 23:26
agilityChen 发表于 2015-1-10 11:40
问题大得很。
每一句代码都有问题:
(1) ia = abs(ia); ib = abs(ib);

“(2) la= ia+ib;
(ia + ib)的类型是int,赋值给Ia时,才转为long。
如果ia + ib已经超过32767或者-32768,就溢出了。
改为Ia = (long)ia + ib才不会有问题。”

在CW下试了一下,没有发现这个问题,就算超过了范围, ia+ib和 (long)ia + ib的结果是一样的。

一周热门 更多>