第六章:计算机的运算方法
1.背景
在计算机中参与运算的数就只有两大类: 无符号数和有符号数, 并且这些数都是存储在寄存器当中, 通常寄存器的位数就是机器字长.
但是在计算机眼里,“+" , "-" 是识别不了的, 所以我们需要别的方法去表示有符号数, 所以后来就出现了用"1"表示负号, 用"0"表示正号.
2.正负数的表示方法
+0.011 在计算机中表示成 0,011
-0.011 在计算机中表示成 1,011
+1100 在计算机中表示成 0.1100
-1100 在计算机中表示成 1.1100
由上面四个例子可以看出, 小数点可以用 "." 和 "," 来表示.
首先 小数点 左边的数字 是表示符号位, 小数点右边的数值表示 真值位.
当一个数是负数, 符号位就用"1"表示.
当一个数是正数, 符号位就用"0"表示.
当一个数是整数, 小数点用 "." 来表示
当一个数是负数, 小数点用 "," 来表示
真值部分照抄就好了.
形式: 符号(小数点)真值
3.原码表示法
当一个真值 为正数, 它的原码就是他自己(当然需要把它表示成机器数)
当一个真值 为负数, 它的原码首先表示出符号位(0/1)+小数点(./,)+自身数值
例如
X=-1100 X[原]=1.1100
X=-0.0111 X[原]=1,0111
4.补码表示法
当一个真值 为正数, 它的补码就是他自己(当然需要把它表示成机器数)
当一个真值 为负数, 它的补码就是它的原码的反码加"1"(除了符号位)
例如:
X=+1010 X[补]=0,1010
X=-1010 X[补]= (第一步 1,1010 第二步 1,0101 第三步 1,0110 ) 所以答案就是 1,0110
5.移码表示法
无论正负, 补码的基础上, 去掉小数点(,/.), 然后将符号位取反就是移码的表示了
6.数的定点表示和浮点表示
采用顶点表示数的话, 小数点要么在数符和数值之间, 要么在数值之后, 所以其表示范围很小, 并且 这两种表示方法只能表示纯小数和纯整数, 所以一旦有别的数, 就会产生溢出.
所以我们就直接讲浮点表示了. 其实形式恨科学计数法 差不多了
给出定义式: N = S * R^i
科学计数法: 5.4*10^2
其中S为尾数(可正负)(相当于5.4), i为阶码(可正负)(相当于2), R是基数(进制数)(相当于10)
譬如我一个真值要转换成2进制的浮点数表示法. 那么表明了R就等于2, 然后S等于二进制数(真值), 其中为了表示出进度最高. 通常采用纯小数的形式去表示, 这时就要移动小数点了, 譬如我移动了4位, 但是实际上i不是填4而是填100 (4的二进制表示法),
也就是说当确定了进制数, 尾数和阶码都要转换成进制数的表示方法.
例如: N= 11.0101 = 0.110101*2^10 = 1.10101*2^1 = 1101.01*2^-10 = 0.00110101*2^100
6.1 浮点数的表示形式
总共4个框 打横来, 首先是阶符然后是阶码的数值部分, 然后是数符, 最后是尾数的数值部分.
例如:
将10进制-54表示成二进制的浮点数
X=-54 二进制= -110110 浮点数表示法= (-0.110110)*2^110
所以其原码(浮点数)=0,110;1.110110
所以其补码(浮点数)=0,110;1.001010
所以其反码(浮点数)=0,110;1.001001
That's all!
6.2 后来浮点数的表示形式
3个框框. 首先是数符, 然后是阶码(含阶符),然后是尾数 !!! 特别注意: 阶码用移码来表示
7. 移位运算
为什么要移位填补, 机器字长是固定, 当你左移或者右移时, 必然会使其出现空位, 那么这些空位到底用什么来填补, 用0/1.
真值为正的时候, 无论是原码补码反码, 左移还是右移 都是用0来添补
真值为负的时候: 对于原码, 无论左移还是右移 用0来填补
真值为负的时候: 对于补码, 左移就用0来补, 右移就用1来补
真值为负的时候: 对于反码, 无论左移还是右移 用1 来填补
这里的左移和右移指的是尾数部分左移还是右移, 不是小数点左右移.
对于正数,三种机器数移位后符号位不变.
左移时最高数位丢1,结果出错;
右移时最低数位丢1,影响精度。
对于负数,三种机器数移位后符号位均不变.
负数的原码左移时,高位丢1,结果出错;低位丢1,影响精度。
负数的补码左移时,高位丢0,结果出错;低位丢1,影响精度。
负数的反码左移时,高位丢0,结果出错;低位丢0,影响精度。
8.加法与减法运算
加法: 整数: A补+B补 = (A+B)补(mod 2^n+1)
加法: 小数: A补+B补 = (A+B)补(mod 2^n)
减法: 整数: (A-B)补 = A补+(-B)补 (mod 2^n+1)
减法: 小数: (A-B)补 = A补+(-B)补(mod 2^n)
1.对阶: 使两个小数点的位置对顿
首先求出阶差, 再按照小阶向大阶看齐的原则, 使阶小的尾数移位
2.尾数求和: 将对阶后的两尾数 按照加减运算规则来求和
3.规格化: 将尾数规格化
1.左规: 当尾数出现00.0.......或者11.1.........需要左规: 将尾数左移一位. 直至 符合00.1..... 或者11.0......
2.右规: 当出现01.xxxxx或10.xxxxx时, 表示尾数溢出,需要右规: 将尾数右移一位,阶码加1.
4.舍入: 提高精度
1. "0舍1入法" : 当尾数右移时, 被移去最高位是0 则舍去, 如果最高位是1 , 就在尾数末尾加1
2. "恒置1法": 尾数右移时, 无论丢掉的最高位是1or0, 都在尾数末尾置为1.
5. 溢出判断: 判断结果否溢出