| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 637 人关注过本帖
标题:新手,问题多,希望各路朋友帮忙解决。
只看楼主 加入收藏
从现在开始
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-4-9
结帖率:0
收藏
已结贴  问题点数:10 回复次数:8 
新手,问题多,希望各路朋友帮忙解决。
谁能详细的介绍一个有关补码计算的例子吗?新手的我真的不理解这东西!
搜索更多相关主题的帖子: 朋友 
2013-04-09 23:06
mskeheng
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:48
专家分:179
注 册:2013-3-13
收藏
得分:2 
正整数的话,补码是二进制数本身,负数是先求二进制数,再取反,即1变成0,0变1,最后加1就是补码了
2013-04-09 23:13
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:2 
有本《深入理解计算机系统》,里面有补码运算的详细过程,建议看看

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-04-10 06:42
小鸦
Rank: 2
等 级:论坛游民
帖 子:8
专家分:24
注 册:2013-3-29
收藏
得分:2 


计算机内部是采用二补数(2的补码)表示负数。

减法与加法相比,是不一样的机制。加法只有向前进位,减法则有可能会向前借位,同时,前一位又可能再向前借位,十分麻烦。但我们知道减一个正数就等于加一个负数,于是就需要这个负数容易表示并且符合运算规律,就有了是减法变加法基于补码的运算方式。

对于【负数是先求二进制数,再取反,即1变成0,0变1,最后加1就是补码了】
举个例子:(这是《code》里的例子)

253 – 176                          1111 1101 – 1011 0000

这个减法运算在个位的时候,就需要向前借位了,换个思路

这是一个三位数,三位数的最大值是999,先用

999 – 176 = 823           同理 用8位二进制数中的最大值减去减数     1111 1111 – 【 1011 0000 】 = 【 0100 1111 】

然后,用被减数253加上上面求出来的这个值823
 
253 + 823 = 1076           同理 1111 1101 + 0100 1111 = 1 0100 1100

然后把这个值加1再减去1000,这样就得到了77

1076 + 1 - 1000 = 77       同理 把上述结果加一再减去9位二进制数的最小值1 0000 0000。

1 0100 1100 + 1 = 1 0100 1101
 
1 0100 1101 – 1 0000 0000 = 0100 1101


经过观察【 0100 1111 】 就是对 【 1011 0000 】的取反 也就是对减数176取反。

最后一步,
1 0100 1101 – 1 0000 0000 = 0100 1101 就是把1去掉就可以了。

也就是 176 = 1011 0000 取反为 0100 1111 加 1 为 0101 0000(176的补码) 最后加上 253(1111 1101)
01010000 + 1111 1101 = 0100 1101 (这样就只用取反和做加法运算了)


999 – 176 + 253 + 1 - 1000,即253 + (999 – 176) + 1 – 1000,即 253 - 176 + 999 + 1 - 1000 即 253 - 176 。

也就是说

假设2个数为 X,Y

Y的2的补码等于(11111111-Y)+1。所以,X加上Y的2的补码,就等于:

X + (11111111-Y) + 1 假设 等于 Z

Z = X + (11111111-Y) + 1式子可以写为Z = X - Y + 100000000,这在硬件上可以理解为两部分电路来实现,第一部分是前面的X - Y(这里姑且不管计算的结果是正还是负),第二部分是X - Y计算的结果再和100000000相加,最终得到计算的结果Z, 而在8位的计算机上100000000是不能出现的,其实这时100000000就相当于00000000(舍去了最高位)即

Z = X + (11111111 - Y) + 1
= X - Y + 100000000
= X - Y + 00000000
= X - Y








一 步 一 印 一 狗 屎 ...

一 嗔 一 痴 一 个 人 ...



2013-04-10 08:45
RebelRebel
Rank: 1
等 级:新手上路
帖 子:19
专家分:7
注 册:2013-4-3
收藏
得分:2 
正数的补码就是原码,负数的补码是原码“取反再加1”,负数的原码也是补码“取反再加1”

青春,应该是奋斗的,而不是娱乐的。。。。。。。。
2013-04-10 18:37
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:2 
这种问题不会问百度吗?

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-10 19:30
c_ios
Rank: 2
等 级:论坛游民
帖 子:30
专家分:56
注 册:2013-3-12
收藏
得分:2 
别辜负四楼的一番苦心啊、、、、

没有所谓的天才、只有不努力的蠢材、、、、
2013-04-10 22:33
tremere
Rank: 6Rank: 6
来 自:火星
等 级:侠之大者
帖 子:223
专家分:432
注 册:2013-3-11
收藏
得分:2 
回复 7楼 c_ios
同感

极品菜鸟,来学习啦,啦啦啦啦啦啦啦。。。
2013-04-11 16:57
我叫沃恩
Rank: 12Rank: 12Rank: 12
来 自:Asia
等 级:贵宾
威 望:10
帖 子:1234
专家分:3865
注 册:2013-3-29
收藏
得分:2 
同意6楼,去问度娘吧

因为我是菜鸟,所以应该被骂! 细节+坚持=成功!
2013-04-11 22:43
快速回复:新手,问题多,希望各路朋友帮忙解决。
数据加载中...
 
   



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

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