有师弟来问导论作业,刚好最近数电也才复习过相关的内容,顺手整理复述一下查到的东西。
关于名称
补码应该叫Diminished Radix Complement,而反码则是Radix Complement。最常见的所谓1's complement与2's complement其实是是相对于2进制而言。
也就是说,对于2进制,Diminished Radix Complement可称1's complement,Radix Complement可称2's complement。那么对于8进制,Diminished Radix Complement应称作7's complement而Radix Complement则为8's complement。
注意,2's complement这个名字对于2进制指的是补码,而对于3进制就是反码了,以此类推。
计算方法
Diminished Radix Complement的算法
设位数为n,需要计算的数字为N,属于r进制,则其反码((r-1)'s complement)为
(rn – 1) – N
计算时,rn-1用同样的进制表示比较方便,比如三位的10进制105-1就是99999,8进制的85-1就是(77777)8
比如
(AA)16的反码(15's complement)是(FF)16 - (AA)16 = (55)16
(546700)10的反码(9's complement)是(999999)10 – (546700)10 = (453299)10
(017)8的反码(7's complement)是(777)8 - (017)8 = (760)8
(1011000)2的反码(1's complement)是(1111111)2 - (1011000)2 = (0100111)2
这意味着一个数加上自己的反码得到的是rn-1,也就是10进制的99999,8进制的(77777)8这样
Radix Complement的算法
都和2进制的2's complement一样,Radix Complement=Diminished Radix Complement + 1
或者说是(rn – 1) – N + 1,简化一下就是rn – N,不过用前者借位一般比较少(试想999-621与1000-621,哪个好算?),更加方便。
(AA)16的补码(16's complement)是(FF)16 - (AA)16 + 1 = (56)16
(546700)10的补码(10's complement)是(999999)10 – (546700)10 + 1= (453300)10
(017)8的补码(8's complement)是(777)8 - (017)8 + 1 = (761)8
(1011000)2的补码(2's complement)是(1111111)2 - (1011000)2 + 1 = (0101000)2
这意味着一个数加上自己的补码得到的是rn,也就是一个1跟着一堆0,比如10进制的100000,8进制的(10000)8之类。
参考资料:http://www2.southeastern.edu/Academics/Faculty/galkadi/297/notes/chapter1.doc(应当来自于M.Morris.Mano的一本书)