定点数的表示和运算(原码、补码、移码及加减乘除)
第一次撸笔记,难免有错误,欢迎在评论区指出

1. 定点数:小数点位置固定(即日常的计数操作,如1.23)
浮点数:小数点位置不固定(比如科学计数法)
2.

3. 无符号数(通常只讨论整数):整个机器字长的全部二进制均为数值位,没有符号位,相当于数的绝对值。表示范围:8位二进制数,2^8种不同状态,0000 0000—1111 1111即0—255
n位无符号数表示范围:0—2^(n-1)
4. 有符号数的定点表示,数值部分也称尾数

5. 原码:用尾数表示真值的绝对值,符号位0-正 1-负
若机器字长为n+1位,则尾数占n位(下图第一行表示“位权”,逗号表示定点小数,小数点表示定点小数)


6. 反码:符号位为0,与原码相同;符号位为1,则数值位全部取反。整数与小数表示范围与原码一致。反码只是原码转变成补码的中间状态,没啥用。
7. 补码:正数的补码=原码 负数的补码=反码末位+1(要考虑进位)
补码中+0和-0是同一种表示形式,故表示范围比原码多一个数(如下图,暂且理解 为这个数就是这样规定的,欢迎补充)

8. 负数补码转化为原码:全部取反,末位+1,正数跟原来一样(即补码和原码互相转化方法相同)
9. 移码(只能表示整数):补码的符号位取反,表示范围与补码相同
10. 如果把移码的符号位当数值看的话,移码的递增对应真值的递增(二进制和十进制转化不对应,只是对应递增关系)。移码的作用:移码表示的整数方便对比大小

11. 原码反码补码表示范围和转化方法总结


12. 加减运算:为了省钱,把减的想办法变成加的。这里想到了模运算(想象一下时钟)。互为补数的两个数绝对值之和等于模。模-|a|=a的补数(补码原本的定义)。如果计算机是8bit,说明计算机运算时会天然地mod 2^8 ,也就是说计算机可以把所有整数映射到0—2^8-1之间,此时原码减原码可以转化为原码加补码。这也就是补码的作用,让减法操作转变为加法操作,ALU无需集成减法器,节省硬件成本。执行加法操作时,符号位一起参与运算。
公式:[A]补+[B]补=[A+B]补;[A-B]补=[A]补+[-B]补
13. 溢出:对补码进行加法运算容易导致溢出,溢出有三种判断方法,核心逻辑均为两个同号的数相加最终得到了异号的结果。


上溢:正+正=负 下溢:负+负=正
方法一:几个字母连在一起表示与运算,+表示或运算,上横线表示非运算。方法一本质上也是“上溢:正+正=负 下溢:负+负=正”的逻辑表达式的形式。搞出这个式子是为了方便逻辑电路(与门、或门、非门)实现。

方法二:我的评价是不如方法三(其实道理差不多)

(方法三比较重要)实际储存时,只储存一个符号位,只有在运算时多复制一个符号位。运算结果中两个符号位,前一个表示正确的符号,后一个表示实际算得的符号。运算结果两个符号位数字相同说明没溢出,不同说明有溢出。双符号位补码又称模4补码,单符号位补码又称模2补码。
14. 符号扩展:int—long 短数据—长数据

15. 移位运算:通过改变各个数码位和小数点的相对位置,从而改变各个数码位的位权,可利用移位运算实现乘法除法。由于位数有限,有时无法用算数移位精确地等效乘除法。
16. 原码的算数移位



17. 反码的算数移位

18. 补码的算数移位

19. 循环移位:直接移,被移出的补上空缺,带进位位的也一样。
20. 逻辑移位:左移右移都补零,移出的舍弃。
21. 原码的乘法运算:乘法运算实际上是通过移位+加法运算实现。首先回忆一下运算器是个啥子。。

乘法运算实现:原码一位乘法(因每次移一个位而得名)
(1)符号位的处理:符号位单独处理,两个数的符号位进行异或运算,数值位取绝对值进行乘法运算。
(2)计算之前把ACC清零。乘数存在MQ,被乘数存在X。图中标深灰色的位为当前参与运算的位。如果当前运算的位为1,则ACC加上被乘数;如果当前运算的位为0,则ACC加上0;进行完一次加法操作后将ACC和MQ中的数据统一逻辑右移一位(为了给数错位相加搞的操作),即ACC的最低位会移到MQ的最高位,然后在ACC最高位补0。而原MQ的最低位已经被移出计算器,即被丢弃了。再次判断MQ新的最低位是0还是1,开始新一轮计算。一直这样先加法,后移位,重复n次。移到MQ中乘数只剩最后一位的时候停止(剩下那个是符号位,前面已经异或过了,不用再算)。若是定点小数,小数点隐含在符号位后面的位置。若是定点整数,小数点隐含在MQ最右边一格前面的位置。


(3)原码一位乘法(手算):使用单符号位、双符号位都可以,但是由于补码一位乘法需要双符号位,所以直接干脆全都用双符号位就好。若是定点小数,分开符号位和数值位使用英文句号。若是定点整数,则使用逗号。

22. 补码一位乘法

补码这个最低位打引号是因为它不是真正的最低位,MQ最低位是辅助位。最后多来一次加法会让乘数的符号位也参与运算。

23. (恶心人的)原码除法:
(1)恢复余数法:符号位的处理:符号位单独处理,两个数的符号位进行异或运算,数值位取绝对值进行除法运算。MQ灰色位置是当前要上商的位置,计算机会先默认上1,如果发现余数的符号位为1,即余数是负数,则说明上商1是错误的(下图1),应改为上商0,并恢复原有的余数,即把ACC减掉的除数再加回去(下图2)。 如果发现余数的符号位为0,则说明余数是正的,上商1是对的。(中间绿色框这个ACC+[-|y|]补→ACC这个操作其实我不太明白为啥是-|y|,为啥是减号,我只能想到一种解释就是[|x|-|y|]原=[|x|-|y|]补=[|x|]补+[-|y|]补其中第一个等号成立的条件是|x|-|y|为正,即商一能成功的时候,第二个等号依据是减法公式)


进行完一次这波操作以后ACC,MQ整体逻辑左移,ACC高位丢弃,MQ低位补0。然后继续在灰色格子确定一位商。下图是假定机器字长只有五位,故只能计算五位的商。下图为定点小数的除法运算,小数点隐含在符号位后面。


下图为手算过程

(2)加减交替法(不恢复余数法):相比恢复余数法有一个优化的地方就是如果商1后余数是负数,让余数逻辑左移再加上[|y|]补即可。

24. 补码的除法运算:加减交替法(直接贴ppt了)

