计算机组成原理 第二章 数据的表示和运算
第二章 数据的表示和运算
数制与编码
进制转换



使用二进制的原因

二进制与八进制、十六进制的转换

各种进制的书写方式

十进制转换为任意进制
整数部分

\[\begin{align}
&十进制转换二进制\\
&如(75)_{10}\\
&\frac{75}{2}=37……1\space K_0\\
&\frac{37}{2}=18……1\space K_1\\
&\frac{18}{2}=9……0\space K_2\\
&\frac{9}{2}=4……1\space K_3\\
&\frac{4}{2}=2……0\space K_4\\
&\frac{2}{2}=1……0\space K_5\\
&\frac{1}{2}=0……1\space K_6\\
&K_0K_1K_2K_3K_4K_5K_6=1101001
\end{align}
\]

小数部分

\[\begin{align}
&十进制转换二进制\\
&如(75.3)_{10} \space\space小数部分=0.3\\
&0.3*2=0.6=0+0.6 \space K_{-1}\\
&0.6*2=1.2=1+0.2 \space K_{-2}\\
&0.2*2=0.4=0+0.4 \space K_{-3}\\
&0.4*2=0.8=0+0.8 \space K_{-4}\\
&0.8*2=1.6=1+0.6 \space K_{-5}\\
&……\\
&0.3D=0.01001……B\\
&小数无法准确表述\\
\end{align}
\]

十进制转换二进制(拼凑法)

总结

BCD码(Binary-Coded Decimal)



修正数据
\[\begin{align}
&(9+9)_{10}\\
&(9)_{10}\rightarrow (1001)_2\\
&(9+9)_{2}=1001 1001\\
&1001\\
+&1001\\
-&---\\
1&0010\\
&10010超出了8421码中的1010-1111\\
&+(6)_{10}\Leftrightarrow+(0110)_2修正\\
1&0010\\
+&0110\\
-&---\\
1&1000\\
\end{align}
\]
相加结果在合法范围(1010~1111)内,不需要修正
其他编码

总结

字符与字符串
ASCII码

可印刷字符:32~126
其余为控制、通信字符
大写字母:65(0100 0001)~ 90(0101 1010)
小写字母:97(0110 0001)~ 122(0111 1010)

汉字的表示和编码

输入:输入编码
输出:汉字字形码
字符串


大端模式&小端模式


总结

奇偶校验码

校验原理



\[\begin{align}
&当d=1时,无检错能力;当d=2时,有检错能力;当d\geq3时,若设计合理,可能具有检错纠错能力(海明码)\\
\end{align}
\]
奇偶校验码

例题

\[\begin{align}
&奇校验:(1)1001101~~(0)1010111\\
&偶校验:(0)1001101~~(1)1010111\\
\end{align}
\]

只能发现数据代码中奇数位的出错情况,但不能纠错
总结

海明码
简单思路

求解步骤



总结

循环冗余校验码

基本思想

校验步骤(模二除)

\[\begin{align}
&G(x)=x^3+x^2+1=1*x^3+1*x^2+0*x^1+1*x^0\rightarrow 1101\\
&~~~~~~110101\\
&-------------------\\
1101~|&101001000\\
&1101\\
&~~1110\\
&~~1101\\
&-------------------\\
&~~~~0111\\
&~~~~0000\\
&-------------------\\
&~~~~~~1110\\
&~~~~~~1101\\
&-------------------\\
&~~~~~~~~0110\\
&~~~~~~~~0000\\
&-------------------\\
&~~~~~~~~~~1100\\
&~~~~~~~~~~1101\\
&-------------------\\
&~~~~~~~~~~~~001\rightarrow校验位\\
&对应的CRC码为101001~~001
\end{align}
\]

s
余数为001、010时并不能确定是哪一位出错了
此时是信息位过多,降低信息位就可以解决问题

\[\begin{align}
&K个信息位,R个校验位,若生成多项式选择得当,且2^R\geq K+R+1,则CRC码可纠正1位错\\
\end{align}
\]
总结

定点数的表示


无符号数
通常只有无符号整数,而没有无符号小数
\[\begin{align}
&1001100B\\
&=1*2^7+1*2^6+0*2^5+0*2^4+1*2^3+1*2^2+0*2^1+0*2^0\\
&=156D\\
\end{align}
\]

有符号数的定点表示


原码
用尾数表示真值部分的绝对值,符号位“0/1”对应“正/负”
若机器字长为n+1位,则尾数占n位



反码
若符号位为0,则反码与原码相同
若符号位为1,则数值位全部取反

反码是原码转变为补码的一个中间状态

补码
正数的补码=原码
负数的补码=反码末位+1(要考虑进位)



\[\begin{align}
&设机器字长为8位\\
&[+0]_{原}=0000~0000\\
&[+0]_{反}=0000~0000\\
&[+0]_{补}=0000~0000\\
&\\
&[-0]_{原}=1000~0000\\
&[-0]_{反}=1111~1111\\
&[-0]_{补}=1~0000~0000\\
&由于机器字长为8位,进位丢弃\\
&[-0]_{补}=0000~0000\\
\end{align}
\]

逆向
将负数补码转回原码的方法相同:尾数取反,末尾+1
\[\begin{align}
&[-19]_{原}=1001~0011\\
&[-19]_{反}=1110~1100\\
&[-19]_{补}=1110~1101\\
&[-19]_{原}=1001~0010+0000~0001=1001~0011\\
\end{align}
\]
移码
补码的基础上将符号位取反
移码只能用于表示整数


几种码表示定点整数

练习
\[\begin{align}
&假设机器字长为8位\\
&定点整数x=50\\
&[+50]_{原}=0011~0010\\
&[+50]_{反}=0011~0010\\
&[+50]_{补}=0011~0010\\
&[+50]_{移}=1011~0010\\
&定点整数x=-100\\
&[-100]_{原}=1110~0100\\
&[-100]_{反}=1001~1011\\
&[-100]_{补}=1001~1100\\
&[-100]_{移}=0001~1110\\
\end{align}
\]
知识回顾


各种码的作用

用加法代替减法
表盘为例

\[\begin{align}
&10+9=19\\
&19\%12=7\\
&相当于求余数\\
\end{align}
\]
模运算的性质


可以说在模12的情况下上述数字等价

其中-3和9互为补数,二者绝对值之和等于模
\[\begin{align}
有符号数&~~~~~~~~~~~~~~~~~~~无符号数\\
14~~~~~~&0000~1110~~~~~~~~14\\
-14~~~+&1000~1110~~~~~~142\\
-----&-----------\\
0~~~~~~&1001~1100~~~~~~156\\
&模-a的绝对值=a的补数\\
&0000~1110\\
-&0000~1110\\
-----&-----------\\
&0000~0000\\
&\\
&模2^8-0000~1110\\
&1~0000~0000\\
-&~~~0000~1110\\
-----&-----------\\
&~~~1111~0010\\
-----&-----------\\
&~~~0000~1110\\
+&~~~1111~0010\\
-----&-----------\\
&~1~0000~0000\\
\end{align}
\]


\[\begin{align}
&求-66的补码\\
&[-66]_{原}=1100~0010\\
&[-66]_{反}=1011~1101\\
&[-66]_{补}=1011~1110\\
&[+88]_{原}=0101~1000\\
&1101~1000\\
+&0011~1110\\
--&-----------------\\
1~&0001~0110~~~~~~22D\\
\end{align}
\]

移位运算

算术移位


原码的算术移位


\[\begin{align}
&[+20]_{原}=0001~0100\\
&{左移一位}=0010~1000=+40D\\
\end{align}
\]
反码的算数移位

补码的算数移位

\[\begin{align}
&[-20]_{原}=1001~0100\\
&[-20]_{反}=1110~1011\\
&[-20]_{补}=1110~1100\\
&左移一位=1010~1000\\
&[-20]_{原}=1001~0100\\
&[-20]_{反}=1110~1011\\
&[-20]_{补}=1110~1100\\
&右移一位=1111~0110\\
\end{align}
\]
逻辑移位(针对无符号数)

应用举例

循环移位

总结

加减运算

原码的加减运算


补码的加减运算


\[\begin{align}
&A=15,B=-24,C=124,求[A+C]_{补}[B-C]_{补}\\
&[A]_{原}=0000~1111\\
&[A]_{反}=0000~1111\\
&[A]_{补}=0000~1111\\
&[B]_{原}=1001~1000\\
&[B]_{反}=1110~0111\\
&[B]_{补}=1110~1000\\
&[C]_{原}=0111~1100\\
&[C]_{反}=0111~1100\\
&[C]_{补}=0111~1100\\
&[A+C]_{补}\\
&0000~1111\\
+&0111~1100\\
----&------------\\
&1000~1011\\
&1111~0100\\
&1111~0101~~~~~~-117D\\
&[B-C]_{补}\\
1&~0000~0000\\
-&~0111~1100\\
----&-------------\\
&~1000~0100\\
+&~1110~1000\\
----&-------------\\
&~0110~1100\\
&~0110~1100\\
&~0110~1100~~~~~~+108D\\
\end{align}
\]
出现了溢出
溢出判断

一位符号逻辑表达式



进位判断

双符号位


符号扩展
整数


小数

总结

乘法运算
手算乘法(十进制)

手算乘法(二进制)


原码一位乘法



实现方法:先加法再移位,重复n次
(0)乘法进行前ACC置0

(1)第一步加法
加法

移位

(2)第二步加法
加法

移位

(3)第三步加法
加法

移位

(4)第四步加法
加法

移位

乘法结果

修正符号位

原码一位乘法(手算模拟)

\[\begin{align}
&高位部分积~~~~ ~~~~低位部分积~~~~ ~~~~ ~~~~说明\\
&~~00.0000~~~~ ~~~~ ~~~~ ~~~~ 101\underline{1}|~~~~ ~~~~ 低位=1~~~~ +|x|\\
+|x|&~~00.1101~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~|\\
----&---------------------\\
&~~00.1101\\
右移&~~00.0110~~~~ ~~~~ ~~~~ ~~~~ 110\underline{1}|1~~~~ ~~~ 低位=1~~~~ +|x|\\
+|x|&~~00.1101~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~|\\
----&---------------------\\
&~~01.0011\\
右移&~~00.1001~~~~ ~~~~ ~~~~ ~~~~ 111\underline{0}|11~~ ~~~低位=0~~~~ +0 \\
+&~~00.0000\\
----&---------------------\\
&~~00.1001\\
右移&~~00.0100~~~~ ~~~~ ~~~~ ~~~~ 111\underline{1}|011 ~~~低位=1~~~~ +|x| \\
+|x|&~~00.1101\\
----&---------------------\\
&~~01.0001\\
右移&~~00.1000~~~~ ~~~~ ~~~~ ~~~~ 111\underline{1}|1011 ~右移部分积和乘数全部移出 \\
&|x|=00.10001111\\
&x*y=-0.10001111\\
\end{align}
\]
补码的一位乘法


辅助位

手算模拟

\[\begin{align}
&高位部分积~~~~ ~~~~低位部分积~~~~ ~~~~ ~~~~说明\\
&~~00.0000~~~~ ~~~~ ~~~~ 0.101\underline{1}|0~~~~ ~~~~ ~~~~起始情况\\
+[-x]_补&~~00.1101~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ Y_4Y_5=10,Y_5-Y_4=-1,+[-x]_{补}\\
----&-----------------------------\\
&~~00.1101\\
右移&~~00.0110~~~~ ~~~~ ~~~~ 10.10\underline{1}|10~~~~ ~~~~ ~~~~右移部分积和乘数\\
+0&~~00.0000~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ Y_4Y_5=10,Y_5-Y_4=0,+0\\
----&-----------------------------\\
&~~00.0110\\
右移&~~00.0011~~~~ ~~~~ ~~~~ 010.1\underline{0}|110~~~~ ~~~~ ~~~~右移部分积和乘数\\
+[x]_补&~~11.0011~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ Y_4Y_5=01,Y_5-Y_4=1,+[x]_补\\
----&-----------------------------\\
&~~11.0110\\
右移&~~11.1011~~~~ ~~~~ ~~~~ 0010.\underline{1}|0110~~~~ ~~~~ ~~~~右移部分积和乘数\\
+[-x]_补&~~00.1101~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ Y_4Y_5=10,Y_5-Y_4=-1,+[-x]_补\\
----&-----------------------------\\
&~~00.1000\\
右移&~~00.0100~~~~ ~~~~ ~~~~ \underline{\underline{0001}}\underline{0}.|10110~~~~ ~~~~ ~~~~右移部分积和乘数\\
+[x]_补&~~11.0011~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ Y_4Y_5=01,Y_5-Y_4=1,+[x]_补\\
----&-----------------------------\\
&~~11.0111\\
&[x*y]_补=11.0111~0001\\
&x*y=-0.1000~1111\\
\end{align}
\]
除法运算
手算除法(十进制)


手算除法(二进制)

恢复余数法


原码除法:恢复余数法

(0)初始

(1)第一步
上商

求余数

判断上商是否正确
01011上商后得11110,相减结果为负,应上商0

修正

逻辑左移

(2)第二步
上商

求余数

判断上商是否正确
相减结果为正数,上商正确

逻辑左移

(3)第三步
上商

求余数

判断上商是否正确
上商无误
逻辑左移

(4)第四步
上商

求余数

判断上商是否正确
相减结果小于0,上商有误

修正

逻辑左移

(5)第五步:最后一步除法
上商&求余数

判断上商是否正确

最后一步除法,如果上商求余数结果小于0.还需要继续恢复余数
(6)最后一步
\[\begin{align}
&余数=ACC*2^{-n}\\
\end{align}
\]

原码除法(手算)



加减交替法



默认规定
被除数要小于除数,否则硬件电路无法运行,如果被除数大于除数,商的结果为大于1的数将无法表示
通过第一步的商来判断被除数与除数的大小关系
第一步商的结果一定为负值,如果为正值说明被除数比除数大,硬件电路会立即停止运算
补码除法

加减交替法

总结

C语言中的强制类型转换


数据的存储和排列
大小端模式

边界对齐


浮点数的表示






浮点数尾数的规格化

左规&右规




规格化浮点数的特点



总结


IEEE754 浮点数标准

\[\begin{align}
&IEEE754规定偏置值=2^{n-1}\\
\end{align}
\]


IEEE 754 标准



\[\begin{align}
&(-0.75)_{10}=(-0.11)_2=(-1.1)*2^{-1}\\
&数符=1\\
&尾数部分=.1000~0000……(隐含最高位1)\\
&阶码真值=-1\\
&单精度浮点型偏移量=127D\\
&移码=阶码真值+偏移量=-1+111~1111=0111~1110(凑足8位)\\
\end{align}
\]






总结

浮点数的运算

浮点数的加减运算

\[\begin{align}
&(0)转换格式\\
&5D=101B,\frac{1}{256}=2^{-8},X=-101*2^-8=-0.101*2^{-5}=-0.101*2^{-101}\\
&59D=111011,\frac{1}{1024}=2^{-10},Y=111011*2^{-10}=0.111011*2^{-4}=0.111011*2^{-100}\\
&X:
&[阶码]_{原}=-101\\
&[阶码]_{补}=1011\\
&阶码双符号位补码:11011\\
&[尾数]_{原}=-0.101\\
&[尾数]_{补}=1.011\\
&尾数双符号位补码:11.011\\
&X=11011,11.011000000\\
&Y:
&[阶码]_{原}=-100\\
&[阶码]_{补}=1100\\
&阶码双符号位补码:11100\\
&[尾数]_{原}=0.111011\\
&[尾数]_{补}=0.111011\\
&尾数双符号位补码:00.111011\\
&X=11100,00.111011000\\
&浮点数加减法运算步骤\\
&(1)对阶\\
&小阶向大阶看齐,尾数每右移一位,阶码+1\\
&[1]求阶差:[\Delta E]_补=||E_X|_原+|E_Y|_补|=11011+00100=11111\\
&\Delta=-1\\
&[2]对阶:X:11011,11.011000000\rightarrow 111011,11.1011000000\\
&X=-0.0101*2^{-100}\\
&(2)尾数减法\\
&-Y=11100,11.000101000\\
&11011,11.011000000\\
+&11100,11.000101000\\
---&----------------------------\\
&10.110001000\\
&X_Y=11100,10.110001000\\
&(3)规格化\\
&X_Y=11100,10.110001000\rightarrow11101,011000100\\
&(4)舍入 \\
&无需舍入\\
&(5)判断溢出\\
&常阶码,无溢出,结果真值为2^{-3}*(-0.1001111)_2
\end{align}
\]
舍入



强制类型转换

总结

加法器设计
算术逻辑单元ALU



机器字长=ALU一次可以处理的数据长度
基本逻辑运算


用门电路求偶校验位


一位全加器

串行加法器

并行加法器

总结

加法器、ALU的改进
并行加法器的优化






组内并行&串行




ALU芯片优化



#Carrawayang written
浙公网安备 33010602011771号