| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 24496 人关注过本帖
标题:两个负数的二进制补码是怎么相加的?
只看楼主 加入收藏
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
两个负数的二进制补码是怎么相加的?
今天看了两个二进制补码相加运算:有一个地方一直补懂,
        补码的加法规则是:[X + Y]补 = [X]补 + [Y]补
        补码的减法规则是:[X - Y]补 = [X]补 + [-Y]补
例如:用8位二进制补码计算:25+(-32)     这是一个正数和一个负数的相加,因为正数的最高位是0,负数的最高位是1,0加1后就是1所以下面的式子还算容易理解。
       25                   0 0 0 1 1 0 0 1
               + + + + + + + +
+( - 32 )                1 1 1 0 0 0 0 0
                            ‖‖‖‖‖‖‖‖
    -  7                     1 1 1 1 1 0 0 1

但是两个负数相加该怎么算呢?他们的最高位都是1,相加后等于0,如果最高位成0了,那就表示它不是一个负数了,如果还要进一位,那么规定的是8位进一位就成了9位了。例如下面的
     (-25)                 1 1 1 0 0 1 1 1
+    (-20)                1 1 1 0 1 1 1 1
       -45                1 1 0 0 1 0 1 1 0
45的二进制码:  00101101     -45的二进制码:  1 1 0 1 0 0 1 1
是怎么算出来的呢?难道是先算出来了再算结果的补码吗?那样就不一定会超出要求的8位了。

搜索更多相关主题的帖子: 二进制 
2012-06-25 23:39
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
直接相加,舍去溢出的最高位。

-20的补码你写错了。是11101100

[ 本帖最后由 beyondyf 于 2012-6-26 11:15 编辑 ]

重剑无锋,大巧不工
2012-06-26 11:12
震中地带
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:171
专家分:359
注 册:2012-3-26
收藏
得分:2 
回复 楼主 小赵q1
学习了!今天又有收获!谢谢哈!还有杨大哥
2012-06-26 11:58
jy02326166
Rank: 2
等 级:论坛游民
帖 子:13
专家分:12
注 册:2012-6-8
收藏
得分:4 
以下是引用beyondyf在2012-6-26 11:12:09的发言:

直接相加,舍去溢出的最高位。

-20的补码你写错了。是11101100
.....溢出怎么可以直接舍去
2012-06-26 12:30
jy02326166
Rank: 2
等 级:论坛游民
帖 子:13
专家分:12
注 册:2012-6-8
收藏
得分:4 
两个同符号数相加或两个异符号数相减是有可能溢出的,溢出就是结果超出了补码表示的范围,结果是错误的.
微机原理有这部分的知识.建议看一下.
2012-06-26 12:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
别看见溢出就直接否定,请正确理解我2楼所说的溢出的意思。

如果我把2楼发言中的“溢出”换成“进位”你还会不会质疑我?

由此,我有点怀疑你微机原理掌握的程度。请解释一下处理器的标志寄存器中溢出标志(OF)的置位逻辑。

重剑无锋,大巧不工
2012-06-26 14:34
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 2楼 beyondyf
今天静下心来重新算了一遍终于明白了,步骤如下:
20的二进制补码 = 00010100        25的二进制补码 = 00011001
按位取反后:     11101011        按位取反后:     11100110
末尾加 1 后:    11101100        末尾加 1 后:    11100111
-20的二进制补码 = 11101100       -25的二进制补码 = 11100111
              -20             11101100
           +(-25)    =    + 11100111
              -45            111010011
超出的最高位去掉后 = 11010011
-45 的补码刚好是 11010011,所以以上式子正确。
谢谢b版的提醒,结贴喽
2012-06-26 19:50
快速回复:两个负数的二进制补码是怎么相加的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024489 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved