文章目录
编码
计算机内部状态
计算机内部的信息是二进制存储的,这是因为二进制比较简单,可以用晶体管的通断、电压的高低等表示。通常把其中一个状态称为1,另外一个状态称为0。计算机的数据由0和1构成。
不同的计数法
进位计数法通常是用一个关于基数的整数次幂的和的函数的系数序列表示这个函数的数值(该系数序列的最高次数必须是有限的,但最低次可以到无穷小),其中每个系数是小于基数的自然数。
常见的进位计数法:
- 二进制:逢二进一;
- 八进制:二进制的三位与八进制的一位对应;
- 十六进制:二进制的四位与八进制的一位对应。
十进制和其他进制转换:
十进制 → \rarr →其他进制:加权相加法;
其他进制 → \rarr →十进制:除基取余法。
定点数的编码
定点小数与定点整数:定点小数是纯小数,定点整数是纯整数,最高位一般都是符号位。
原码
实 际 值 = { 非 符 号 位 , 符 号 位 = 0 − 非 符 号 位 , 符 号 位 = 1 实际值=\left\{非符号位,符号位=0\atop-非符号位,符号位=1\right. 实际值={−非符号位,符号位=1非符号位,符号位=0
补码
实 际 值 = { 补 码 , 符 号 位 = 0 补 码 − ( M A X + 1 ) , 符 号 位 = 1 实际值=\left \{ 补码,符号位=0 \atop 补码-(MAX+1),符号位=1 \right. 实际值={补码−(MAX+1),符号位=1补码,符号位=0
移码
实 际 值 = 移 码 − ( M A X + 1 ) / 2 实际值 = 移码-(MAX+1)/2 实际值=移码−(MAX+1)/2
浮点数的编码
浮点数的编码由符号位、阶码、尾数组成。
浮点数的表示范围:
负数: − ( 1 − 2 − 尾 数 位 数 ) × 阶 码 值 m a x ∼ − 2 − 尾 数 位 数 × 阶 码 值 m i n -(1-2^{-尾数位数})\times阶码值_{max}\sim-2^{-尾数位数}\times阶码值_{min} −(1−2−尾数位数)×阶码值max∼−2−尾数位数×阶码值min;
正数: 2 − 尾 数 位 数 × 阶 码 值 m i n ∼ ( 1 − 2 − 尾 数 位 数 ) × 阶 码 值 m a x 2^{-尾数位数}\times阶码值_{min}\sim(1-2^{-尾数位数})\times阶码值_{max} 2−尾数位数×阶码值min∼(1−2−尾数位数)×阶码值max。
浮点数的规格化:
左规:尾数非0且以0开头,向左移动尾数,阶码减少;
右规:尾数超过范围,向右移动尾数,阶码增加。
规范化尾数的形式:正数:0.1[01]*
,负数:-0.1[01]*
。IEEE将最高位的1放入隐藏位,以空余一位的空间;阶码全零全一时,分别为0和无穷大。
运算
加法
一位全加器
S
=
A
⊗
B
⊗
C
−
1
C
=
A
B
+
(
A
⊗
B
)
C
−
1
S=A\otimes{B}\otimes{C_{-1}}\\ C=AB+(A\otimes{B})C_{-1}
S=A⊗B⊗C−1C=AB+(A⊗B)C−1
其中,
C
−
1
C_{-1}
C−1为上一位的进位。
串行进位加法器
将进位连接:
S
n
=
A
n
⊗
B
n
⊗
C
n
−
1
C
n
=
A
n
⋅
B
n
+
(
A
n
⊗
B
n
)
C
n
−
1
S_n=A_n\otimes{B_n}\otimes{C_{n-1}}\\ C_n=A_n\cdot{B_n}+(A_n\otimes{B_n})C_{n-1}
Sn=An⊗Bn⊗Cn−1Cn=An⋅Bn+(An⊗Bn)Cn−1
超前进位加法器
G i = A i ⋅ B i P i = A i ⊗ B i C i = ∑ j = 0 i G j ∏ k = j + 1 i P k G_i=A_i\cdot{B_i}\\ P_i=A_i\otimes{B_i}\\ C_i=\sum\limits_{j=0}^iG_j\prod\limits_{k=j+1}^{i}{P_k} Gi=Ai⋅BiPi=Ai⊗BiCi=j=0∑iGjk=j+1∏iPk
移位
算术移位
移位时符号不变。
补码右移时,将符号位移到下一位。
逻辑移位
一律视为无符号整数,全部移位,补0。
循环移位
循环移位有进位参与循环和进位不参与循环两种。
参与循环:移出的位移入进位,进位移入将要循环移入的位。
不参与循环:移出的位同时移入进位和将要循环移入的位。
定点数的加减法
定点数的减法就是加上补码。
溢出判断:单符号位:若两个数符号相同,那么如果结果符号与这两个数不同,那么就发生了溢出。双符号位:若两个符号位相同,则没有溢出,否则低位被溢出的位数覆盖,高位是真实的符号位。
浮点数的加减法
- 对阶,小阶对齐到大阶;
- 尾数相加减,按定点数加减法规则;
- 规格化,左规或右规;
- 舍入,主要依靠对阶和右规时移出的两位。
- 溢出处理,阶码超过最大值,产生异常;阶码超过最小值,按0算。
定点数的乘法
原码一位乘法
由乘数最后一位是否为1来判断是否加上被乘数,之后乘数和被乘数右移。
补码一位乘法
使用两位符号位判断溢出;乘数末尾补一位 y n + 1 y_{n+1} yn+1,每次执行的操作如下表所示:
y n y n + 1 y_ny_{n+1} ynyn+1 | 操作 |
---|---|
00 | + 0 +0 +0 |
01 | + [ X ] 补 +[X]_{补} +[X]补 |
10 | + [ − X ] 补 +[-X]_{补} +[−X]补 |
11 | + 0 +0 +0 |
每次执行完操作同样右移。
乘法最后的小数位数等于两个乘数的和。
定点数的除法
原码加减交替除法
对于:
X
/
Y
X/Y
X/Y
从最低位开始,先加上
[
−
Y
]
补
[-Y]_{补}
[−Y]补,若减去之后得到了负数,说明不够减,商0,商和余数左移之后加上
[
Y
]
补
[Y]_{补}
[Y]补;若减去之后得到了正数,商1,商和余数左移之后加上
[
−
Y
]
补
[-Y]_{补}
[−Y]补。若最后余数小于0,应再加上
[
Y
]
补
[Y]_{补}
[Y]补。循环执行操作小数位数次。
补码加减交替除法
首先,若被除数与除数同号,减去除数,否则加上除数;
循环执行操作小数位数次:若余数与除数同号,商1,左移,减去除数,否则商0,左移,加上除数。