A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尹旗龙 黑马帝   /  2012-2-10 17:42  /  1688 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 尹旗龙 于 2012-2-11 14:21 编辑

今天看到的一段代码,注释说明是为防相加后溢出
但是实在不懂其中的原理 请高手指点
private int add(int x, int y)
{
  return ((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^ (y&0x80000000);
}

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 maochong 于 2012-2-10 18:56 编辑

你结合位运算原理理解下。
回复 使用道具 举报
((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) 这个是求的实际运算出来的数值,无符号
(x&0x80000000)^(y&0x80000000)这个是求得两数实际的符号位,要么为0,要么为1,代表的正负
然后两数再^运算一下 把数据和符号拼装起来

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
钱兆元 发表于 2012-2-10 22:42
((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) 这个是求的实际运算出来的数值,无符号
(x&0x80000000)^(y&0x80000000) ...

原来是这样 谢谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马