1.补码的计算方式第一种是原码取反+1,第二种是模-原码,这是两种等效的方法,下面简单理解式的证明一下两种方法等效
以一个字节8位举例。假设原码为1001 0110,取反0110 1001,把原码补码得10001 0110 + 0110 1001 = 1111 1111,
也就是说,反码(1001 0110)=8位最大数(1111 1111)- 原码(1001 0110)。
根据第一中取补码的定义:
补码=反码+1
=8位最大数(1111 1111)-原码(1001 0110)+ 1
=8位最大数 [(1111 1111) + 1 ]- 原码(1001 0110)
=1 0000 0000 - 原码(1001 0110)
1 0000 0000即是8位的模256,即第一种求补效果等于第二种求补效果
2. 二进制减法,利用减一个数等于加上这个数的补码原理,现在把这个原理简单理解式证明一下这个原理
首先,我们都是在8位之内计算,高于八位数不影像低8位,在低8位范围内可以认为
0000 0000 = 1 0000 0000,
假设被减数(1101 0101),减数(1001 0110)及其补码[1 0000 0000 - 减数(1001 0110]
差 = 被减数(1101 0101)- 减数(1001 0110)
= 被减数(1101 0101)- 减数(1001 0110)+ 1 0000 0000 ;
= 被减数(1101 0101)+ [1 0000 0000 - 减数(1001 0110)]
= 被减数(1101 0101)+ 补码(0110 1010)
也就是减一个数等于加上一个数的补码
3.关于正负数之间的加减法,也是减去一个数等于加上这个数的补码,
计算机并不认识正负,正负是人为的定义,相关资料网上颇多,不再赘述。
4. 计算两个数之差的一种物理意义,
假设数组引用变量i,j是两位二进制数,取值范围00 01 10 11
当i,j到11后,自动变为00(wrap方式),j - i = ?
j(11) - i(01) = 10 没有发生借位
j(00) - i(01) = 11=-1, 发生借位
规律:两数相减,不考虑正负,差表示j先与i多遍历了几个元素,
并且最大差值是两个数位数能表示的最大值。
这个负号,表示从i,j方向的反方向,从i到j需要遍历几个元素,
11,不看成补码,形式则表示从i->j顺方向为3,也就是从小到大,再从最大返回最小方式
11,看成补码,则表示从i->j的反向经历1个元素,即从大到小再返回大,11是-1的补码。
文章评论(0条评论)
登录后参与讨论