xxy811225
级别: *
精华主题: * 篇
发帖数量: * 个
工控威望: * 点
下载积分: * 分
在线时间: (小时)
注册时间: *
最后登录: *
查看xxy811225的 主题 / 回贴
楼主  发表于: 2007-10-19 18:47

H0568=8+6*16+5*256=1384
可是这个怎么算的 H8731=-30927?
xxy811225
级别: *
精华主题: * 篇
发帖数量: * 个
工控威望: * 点
下载积分: * 分
在线时间: (小时)
注册时间: *
最后登录: *
查看xxy811225的 主题 / 回贴
1楼  发表于: 2007-10-21 18:55
原码、反码、补码在其BCD码前有一个符号位,“0 ”表示正数,“1”表示负数


正数的原码、反码、补码值跟其BCD码一致,在BCD码前加符号位0
例 [H0568]B=0101 0110 1000
[0101 0110 1000]原=[0101 0110 1000]反=[0101 0110 1000]补=0 0101 0110 1000


负数的原码在其BCD码前加符号位“1”;反码将其BCD码求反(求反即1变0,0变1),然后在其前加符号位“1”;原码是将其BCD码求反+1,最后在其前面加符号位“1”,或者说在反码基础上+1(这种算法不正规,但结果是正确的).
我们以H8731为例
因为题目提到在用BCD或十六进制比较时,最高位(在这里是b15)为1时,将作为负的BCD值进行比较
[H8731]原=1000 0111 0011 0001 最高位为1,所以是负数
[H8731]B=-000 0111 0011 0001
[H8731]反=1111 1000 1100 1110
[H8731]补=1111 1000 1100 1111=[H-78CF]=-[7*4096+8*256+12*16+15]=-30927


BCD码有8421、余3码、2421码、5211码、余3循环码等形式。这里(通常)用的是8421码。
在计算机中的数据都是以补码存放的,这一点也是值得注意的.