如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。
概念
符号位为 0 表示正数,为 1 表示负数,数值部分为真值的绝对值,又称为带符号的绝对值。
书写
约定书写时,正数的符号位与数值位用逗号分隔,小数的符号位与数值位用小数点分隔。
原码整数定义
[ x ] 原 = { 0 , x 2 n > x ≥ 0 2 n − x 0 ≥ x > − 2 n [x]_{原}=\left\{ \begin{aligned} 0,x \ \ & 2^n>x\geq 0 \\ 2^n-x \ \ & 0\geq x>-2^n \\ \end{aligned} \right. [x]原={0,x 2n−x 2n>x≥00≥x>−2n
原码小数定义
[ x ] 原 = { x 1 > x ≥ 0 1 − x 0 ≥ x > − 1 [x]_{原}=\left\{ \begin{aligned} x \ \ & 1>x\geq 0 \\ 1-x \ \ & 0\geq x>-1 \\ \end{aligned} \right. [x]原={x 1−x 1>x≥00≥x>−1
举例:求 x=0 的原码
若 x 为小数,则
[ + 0.0000 ] 原 = 0.0000 [ − 0.0000 ] 原 = 1.0000 − 0.0000 = 1.0000 [+0.0000]_原=0.0000 \\ [-0.0000]_原=1.0000-0.0000=1.0000 \\ [+0.0000]原=0.0000[−0.0000]原=1.0000−0.0000=1.0000
若 x 为整数,则
[ + 0 ] 原 = 0 , 0000 [ − 0 ] 原 = 1 , 0000 [+0]_原=0,0000 \\ [-0]_原=1,0000 \\ [+0]原=0,0000[−0]原=1,0000
特点
优点:表示方法简单,直观
缺点:加减运算复杂
引入
减去一个数,可以用加上这个数的补数来代替,从而可以把减法转变为加法。
补码整数定义
[ x ] 补 = { 0 , x 2 n > x ≥ 0 2 n + 1 + x 0 > x ≥ − 2 n ( m o d 2 n + 1 ) [x]_{补}=\left\{ \begin{aligned} 0,x \ \ & 2^n>x\geq 0 \\ 2^{n+1}+x \ \ & 0> x\geq-2^n(mod\ 2^{n+1}) \\ \end{aligned} \right. [x]补={0,x 2n+1+x 2n>x≥00>x≥−2n(mod 2n+1)
[ − 1011000 ] 补 = 2 7 + 1 + ( − 1011000 ) = 1 , 0101000 [ + 1010 ] 补 = 0 , 1010 [-1011000]_补=2^{7+1}+(-1011000)=1,0101000 \\ [+1010]_补 = 0,1010 [−1011000]补=27+1+(−1011000)=1,0101000[+1010]补=0,1010
补码小数定义
[ x ] 补 = { x 1 > x ≥ 0 2 + x 0 > x ≥ − 1 ( m o d 2 ) [x]_{补}=\left\{ \begin{aligned} x \ \ & 1>x\geq 0 \\ 2+x \ \ & 0> x\geq-1(mod\ 2) \\ \end{aligned} \right. [x]补={x 2+x 1>x≥00>x≥−1(mod 2)
[ + 0.1110 ] 补 = 0.1110 [ − 0.1100000 ] 补 = 2 + ( − 0.1100000 ) = 1.0100000 [+0.1110]_补=0.1110 \\ [-0.1100000]_补 = 2+(-0.1100000)=1.0100000 [+0.1110]补=0.1110[−0.1100000]补=2+(−0.1100000)=1.0100000
举例
引入
补码表示很难直接判断其真值大小,因此对所有补码都加上一个 2 n 2^n 2n,得到了移码,可以直观地比较数值大小。
因此用移码表示浮点数的阶码可以方便地判断浮点数的阶码大小。
定义
[ x ] 移 = 2 n + x ( 2 n > x ≥ − 2 n ) [x]_移=2^n+x(2^n>x\geq-2^n) [x]移=2n+x(2n>x≥−2n)
移码与补码的数值部分相同,符号位相反。
定义
定点数即小数点位置固定的数。
浮点数一般形式
N = S ∗ r j N=S*r^j N=S∗rj
S为尾数,j为阶码,r为基数(可取2、4、8、16等)
N = 11.0101 = 0.110101 ∗ 2 10 \begin{aligned} N & = 11.0101 \\ & = 0.110101*2^{10} \end{aligned} N=11.0101=0.110101∗210
小数位第 1 位为 1,且整数部分为 0,为规格化数。
浮点数在机器中的表示形式
S f : S_f: Sf: 代表浮点数的符号
n : n: n: 其位数反映浮点数的精度
m : m: m: 其位数反映浮点数的表示范围
j f , m : j_f,m: jf,m: 共同表示小数点的实际位置
浮点数的表示范围
上溢: 阶码 > 最大阶码 中断溢出处理
下溢: 阶码 < 最小阶码 按机器零处理
浮点数的规格化表示
算术移位(有符号数移位)规则
符号位不变,数值位如下变化。
正数移位举例
A = + 26 = + 11010 [ A ] 原 = [ A ] 补 = [ A ] 反 = 0 , 0011010 A=+26=+11010 \\ [A]_{原}=[A]_{补}=[A]_{反}=0,0011010 A=+26=+11010[A]原=[A]补=[A]反=0,0011010
负数原码移位举例
A = − 26 = − 11010 [ A ] 原 = 1 , 0011010 A=-26=-11010 \\ [A]_原=1,0011010 A=−26=−11010[A]原=1,0011010
负数反码移位举例
A = − 26 = − 11010 [ A ] 反 = 1 , 1100101 A=-26=-11010 \\ [A]_反=1,1100101 A=−26=−11010[A]反=1,1100101
负数补码移位举例
A = − 26 = − 11010 [ A ] 补 = 1 , 1100110 A=-26=-11010 \\ [A]_补=1,1100110 A=−26=−11010[A]补=1,1100110
移位总结
定点数移位,符号位不变。左移时,高位丢有效位,结果出错;右移时,低位丢有效位,影响精度。
原码: 高位有效位 - 1,低位有效位 - 1
反码: 高位有效位 - 0,低位有效位 - 0
补码: 高位有效位 - 0,低位有效位 - 1
算术移位和逻辑移位
定点数加减法
连同符号位一起相加,符号位产生的进位自然丢掉。
溢出
运算结果超出计算机字长所能表示范围的情况,称为溢出。
下述两个例子中的补码运算均发生了溢出。
溢出判断1 —— 符号相同两数相加减
参加运算的两个数(补码形式)符号相同,若其结果的符号与原操作数的符号不同,则发生了溢出。
两数符号位相同,结果的符号位发生变化,溢出。
溢出判断2 —— 最高位进位与符号位
参加运算的两个数,符号位可以不同,如果运算结果中最高数值位的进位与符号位的进位不同,则发生了溢出。
最高数值位无进位,符号位有进位,溢出。
溢出判断3 —— 两位符号位
参加运算的两个数,均采用双符号位(变形补码),如果结果的两位符号位不同,则发生了溢出。
输出结果两位符号位不同,溢出。
无论是否发生溢出,双符号位的高位总代表真正的符号,如果该位为 1,表示结果为负,此时称为下溢,如果该位为 0,表示结果为正,此时称为上溢。
定点数乘法分类
定点原码一位乘性质
定点原码一位乘举例
定点原码一位乘特点
定点数除法分类
恢复余数法
特点:
上商规则:
例题
X = 0.1011 , Y = 0.1101 , 求 X / Y X = 0.1011,Y = 0.1101,求 X/Y X=0.1011,Y=0.1101,求X/Y
采用双符号位进行计算,高位符号位代表了实际极性,所以可以防止因溢出而丢掉正确的符号。
最终结果: X / Y = 0.1101 X/Y = 0.1101 X/Y=0.1101,符号为正,余数为 0.0111 ∗ 2 − 4 0.0111*2^{-4} 0.0111∗2−4。
2 − 4 2^{-4} 2−4 是因为计算过程中左移了 4 4 4 次。
总结
x = S x ∗ 2 j x y = S y ∗ 2 j y x=S_x*2^{j_x} \\ y = S_y * 2^{j_y} x=Sx∗2jxy=Sy∗2jy
五个步骤: 对阶、尾数相加减、规格化、舍入、判溢出
操作目的: 使两数阶码一致,尾数加减可以进行
Δ S = S x ± S y \Delta S=S_x\pm S_y ΔS=Sx±Sy
采用双符号位加减运算。
操作目的: 尽可能提高精度
2 − 1 ≤ ∣ [ S ] 原 ∣ ≤ 1 − 2 − n 2 − 1 ≤ ∣ [ S ] 补 ∣ ≤ 1 2^{-1}\leq |[S]_原|\leq 1-2^{-n} \\ 2^{-1}\leq |[S]_补|\leq 1 2−1≤∣[S]原∣≤1−2−n2−1≤∣[S]补∣≤1
右规
结果的两个符号位不同表示尾数结果溢出,右移 1 位尾数,阶码 J + 1 J+1 J+1。
左规
结果的两个符号位相同,如是原码且数值位最高位为 0,则左移;如是补码且数值位与符号位相同也需左移。同时阶码减去移动的位数。
截断法
直接丢掉附加位电路中的数据。
恒置 1 法
类似于上取整,把计算结果最后一位置 1。
0舍1入法
类似于四舍五入,如果附加位电路中最高位为1,则对数值进 1。
X = 2 0010 ∗ ( 0.11011011 ) , Y = 2 0100 ∗ ( − 0.10101100 ) , 求 X + Y X=2^{0010}*(0.11011011), Y=2^{0100}*(-0.10101100),求 X+Y X=20010∗(0.11011011),Y=20100∗(−0.10101100),求X+Y
Δ J = [ J x ] 补 + [ − J y ] 补 = 11110 [ S x ] 补 = 00.00110110 11 , J = 00100 \Delta J=[J_x]_补+[-J_y]_补=11110 \\ [S_x]_补=00.00110110 \ 11,J=00100 ΔJ=[Jx]补+[−Jy]补=11110[Sx]补=00.00110110 11,J=00100
[ S x ] 补 + [ S y ] 补 = 00.0011011011 11 + 11.01010100 = 11.10001010 11 [S_x]_补+[S_y]_补=00.0011011011\ 11+11.01010100=11.10001010\ 11 [Sx]补+[Sy]补=00.0011011011 11+11.01010100=11.10001010 11
符号位相同,左规,移 1 位, a n s = 11.00010101 10 , J = 00011 ans=11.00010101\ 10,J=00011 ans=11.00010101 10,J=00011。
采用 0 舍 1 入法,得到 [ S ] 补 = 11.00010110 , S = − 0.11101010 [S]_补=11.00010110,S=-0.11101010 [S]补=11.00010110,S=−0.11101010。
未溢出,最终结果为 X + Y = 2 0011 ∗ ( − 0.11101010 ) X+Y=2^{0011}*(-0.11101010) X+Y=20011∗(−0.11101010)。
C 1 = X 1 Y 1 + ( X 1 + Y 1 ) C 0 C 2 = X 2 Y 2 + ( X 2 + Y 2 ) X 1 Y 1 + ( X 2 + Y 2 ) ( X 1 + Y 1 ) C 0 . . . C_1=X_1Y_1+(X_1+Y_1)C_0 \\ C_2=X_2Y_2+(X_2+Y_2)X_1Y_1+(X_2+Y_2)(X_1+Y_1)C_0 \\ ... \\ C1=X1Y1+(X1+Y1)C0C2=X2Y2+(X2+Y2)X1Y1+(X2+Y2)(X1+Y1)C0...
令 P i = X i + Y i , G i = X i Y i P_i=X_i+Y_i,G_i=X_iY_i Pi=Xi+Yi,Gi=XiYi,则
C 1 = G 1 + P 1 C 0 C 2 = G 2 + P 2 G 1 + P 2 P 1 C 0 C_1=G_1+P_1C_0 \\ C_2=G_2+P_2G_1+P_2P_1C_0 C1=G1+P1C0C2=G2+P2G1+P2P1C0
因此可以改进串行加法器,使得加法运算速度与运算数字长度无关。