美文网首页
计算机组成原理之计算篇

计算机组成原理之计算篇

作者: 六寸光阴丶 | 来源:发表于2020-11-07 23:46 被阅读0次

    一、章节导学

    章节导学

    二、进制运算的基础

    1. 进制概述

    1.1 进制的定义
    • 进位制是一种记数方式,亦称进位计数法或位值计数法
    • 有限种数字符号来表示无限的数值
    • 使用的数字符号的数目称为这种进位制的基数或底数
    1.2 常见的进制

    n=10 [0-9] 称为十进制

    • 计算机喜欢二进制,但是二进制表达太长了
    • 使用大进制位可以解决这个问题
    • 八进制、十六进制满足2的n次方的要求

    1024=0x400=0o2000=0b1000000000

    2. 二进制运算的基础

    • 正整数N,基数为r
      N=d_{n-1}d_{n-2}...d_1d_0=d_{n-1}r^{n-1}+d_{n-2}r^{n-2}+...+d_1r+d_0
      例1
      N=1024 \quad N=1*10^3+2*10^1+4
      例2
      N=10000000000 \quad 𝑁 = 1*2^{10}
    2.1 (整数)二进制转换十进制:按权展开法

    N=d_{n-1}d_{n-2}...d_1d_0=d_{n-1}r^{n-1}+d_{n-2}r^{n-2}+...+d_1r+d_0
    例1
    N=(01100101)=1*2^6+1*2^5+1*2^2+1=101
    例2
    N=(11101101)=1*2^7+1*2^6+1*2^5+1*2^3+1*2^2+1=237

    2.2 (整数)十进制转换二进制:重复相除法
    重复相除法

    例1


    image.png
    2.3 (小数)二进制转换十进制:按权展开法

    N=0.d_{-1}d_{-2}...d_{-n}=d_{-1}r^{-1}+d_{-2}r^{-2}+...+d_{-n}r^{-n}

    例1
    N=0.11001=1*2^{-1}+1*2^{-2}+1*2^{-5}=0.78125=\frac{25}{32}
    例2
    N=0.01011=1*2^{-2}+1*2^{-4}+1*2^{-5}=0.34375=\frac{11}{32}

    2.4(小数)十进制转换二进制:重复相乘法
    重复相乘法

    例1


    重复相乘法

    三、有符号数与无符号数

    问:怎么判断他是数字位还是符号位呢?
    答:使用0表示正数,使用1表示负数

    1. 原码表示法

    1.1 原码表示法
    • 使用0表示正数、1表示负数
    • 规定符号位位于数值第一位
    • 表达简单明了,是人类最容易理解的表示法
    1.2 原码表示法的问题

    0有两种表示方法:00、10
    原码进行运算非常复杂,特别是两个操作数符号不同的时候

    • 判断两个操作数绝对值大小
    • 使用绝对值大的数减去绝对值小的数
    • 对于符号值,以绝对值大的为准
    1.3 希望的改进
    • 希望找到不同符号操作数更加简单的运算方法
    • 希望找到使用正数代替负数的方法
    • 使用加法操作代替减法操作,从而消除减法

    四、二进制的补码表示法

    1. 补码的定义

    x=\left\{ \begin{array}{rcl} x && {2^n>x\geq0}\\ 2^{n+1}+x && {0>x\geq-2^n}\\ \end{array} \right.

    例子1:n=4x=13,计算x的二进制原码和补码

    原码:x=0,1101,补码:x=0,1101

    例子2:x=-13,计算x的二进制原码和补码

    原码:x=1,1101,补码:2^{𝑛+1} + 𝑥 = 2^{4+1} − 13 = 100000 − 1101 = 10011
    补码:x=1,0011

    例子3:例子3:x=-7,计算x的二进制原码和补码

    原码:x=1,0111,补码:2^{𝑛+1} + 𝑥 = 2^{4+1} − 7 = 100000 − 0111 = 11001
    补码:x=1,1001

    例子4:x=-1,计算x的二进制原码和补码

    原码:x=1,0001,补码:2^{𝑛+1} + 𝑥 = 2^{4+1} − 1 = 100000 − 0001 = 11111
    补码:x=1,1111

    五、二进制的反码表示法

    1. 引进补码的目的

    • 减法运算复杂,希望找到使用正数替代负数的方法
    • 使用加法代替减法操作,从而消除减法
    • 在计算补码的过程中,还是使用了减法!!
    • 反码的目的是找出原码和补码之间的规律,消除转换过程中的减法

    2. 反码的定义

    x=\left\{ \begin{array}{rcl} x && {2^n>x\geq0}\\ (2^{n+1}-1)+x && {0>x\geq-2^n}\\ \end{array} \right.

    例子1:x=-13,计算x的二进制原码和反码

    原码:x=1,1101,反码:(2^{𝑛+1}-1) + 𝑥 = (2^{4+1}−1)-13 = 011111− 1101 = 10010
    反码:x=1,0010

    例子2:例子3:x=-7,计算x的二进制原码和反码

    原码:x=1,0111,反码:(2^{𝑛+1}-1) + 𝑥 = (2^{4+1}-1) − 7 = 011111− 0111 = 11000
    反码:x=1,1000

    反码
    • 负数的反码等于原码除符号位外按位取反
    • 负数的补码等于反码+1

    例子1:x=-7,计算x的二进制原码和反码和补码

    原码:x=1,0111 反码:x=1,1000 补码:x=1,1001

    例子2:x=-9,计算x的二进制原码和反码和补码

    原码:x=1,1001 反码:x=1,0110 补码:x=1,0111

    原码,反码,补码

    六、小数的补码

    x=\left\{ \begin{array}{rcl} x && {1>x\geq0}\\ 2+x && {0>x\geq-1}\\ \end{array} \right.

    例子1:x=\frac{9}{16},计算x的二进制原码和反码和补码

    原码:x=0,0.1001 反码:x= 0,0.1001 补码:x= 0,0.1001

    例子2:x=-\frac{11}{32} ,计算x的二进制原码和反码和补码

    原码:x=1,0.01011 反码:x=1,1.10100 补码:x=1,1.10101

    七、定点数与浮点数

    1. 定点数的表示方法

    • 小数点固定在某个位置的数称之为定点数


      定点数
    非纯整数或纯小数

    2. 浮点数的表示方法

    2.1 为什么使用浮点数
    • 计算机处理的很大程度上不是纯小数或纯整数
    • 数据范围很大,定点数难以表达
    2.2 浮点数的表示方法
    浮点数的表示格式

    123450000000 = 1.2345 × 10^{11}
    1.2345:尾数
    10:基数 11:阶码

    N= S \times r^j
    S:尾数 r:基数 j:阶码

    浮点数

    尾数规定使用纯小数

    11.0101 = 0.110101 × 2^{10}
    11.0101 = 0.0110101 × 2^{11}

    浮点数
    浮点数的表示范围

    假设阶码数值取m位,尾数数值取n
    N=S \times r^j

    阶码能够表示的最大值:2^m-1,考虑符号位:[-(2^m-1),2^m-1]

    尾数能够表示的最大值:1-2^{-n}
    尾数能够表示的最小值:2^{-n}
    尾数表示范围: [2^{-n},1-2^{-n}],考虑符号位: [-(1-2^{-n}),-(2^{-n})][2^{-n},1-2^{-n}]

    阶码表示范围: [-(2^m-1),2^m-1]
    尾数表示范围: [-(1-2^{-n}),-(2^{-n})][2^{-n},1-2^{-n}]

    image.png
    单精度与双精度浮点数

    单精度浮点数: 使用4字节、32位来表达浮点数(float)
    双精度浮点数: 使用8字节、64位来表达浮点数(double)

    2.3 浮点数的规格化
    • 尾数规定使用纯小数
    • 尾数最高位必须是1

    正确:11.0101 = 0.110101 × 2^{10}
    错误:11.0101 = 0.0110101 × 2^{11}
    错误:11.0101 = 0.00110101 × 2^{100}
    错误:11.0101 = 1.10101 × 2^1

    例子1:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数 \frac{13}{128}表示为二进制浮点数。

    原码=反码=补码: x = 0.0001101000
    浮点数规格化: x = 0. 1101000 * 2^{−11}
    尾数为1101000000,尾数符为0,阶符为1,阶码为0011

    表示方法

    例子2:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数−54表示为二进制浮点数。

    原码: x = 1,110110
    浮点数规格化:x = −0. 110110 ∗ 2^{110}
    尾数为1101100000,尾数符为1,阶符为0,阶码为0110
    尾数反码0010011111,尾数补码0010100000

    表示方法

    3. 定点数与浮点数的对比

    • 当定点数与浮点数位数相同时,浮点数表示的范围更大
    • 当浮点数尾数为规格化数时,浮点数的精度更高
    • 浮点数运算包含阶码和尾数,浮点数的运算更为复杂
    • 浮点数在数的表示范围、精度、溢出处理、编程等方面均优于定点数
    • 浮点数在数的运算规则、运算速度、硬件成本方面不如定点数

    八、定点数的加减法运算

    数值位与符号位一同运算,并将符号位产生的进位自然丢掉
    溢出判断,单符号位表示变双符号位,双符号位产生的进位丢弃,结果的双符号位不同则表示溢出

    1. 整数加法

    A[补] + B[补] = [A+B][ 补] (𝑚𝑜𝑑2^{𝑛+1})

    例子1:A=-110010, B=001101,求A+B

    A[补] = 1,001110
    B[补] = B[原] = 0,001101
    A[补] + B[补] = (A + B)[补] =1,011011
    A + B = −100101

    例子3:A=-10010000, B=-01010000,求A+B

    A[补] = 1,01110000
    B[补] = 1,10110000
    A[补] + B[补] = (A + B)[补] =1,00100000
    A + B =-11100000

    2. 小数加法

    A[补] + B[补] = [A+B][ 补] (mod2)

    例子2:A=-0.1010010, B=0.0110100,求A+B

    A[补] = 1,1.0101110
    B[补] = B[原] = 0,0.0110100
    A 补 + B 补 = (A + B)[补]=1,1.1100010
    A + B = -0.0011110

    例子4:A=-10010000, B=-11010000,求A+B

    A[补] = 1, 01110000
    B[补] = 1, 00110000
    A[补] + B[补] = (A + B)[补] = 0,10100000
    A + B = 10100000
    发生了溢出

    3. 判断溢出

    3.1 双符号位判断法
    • 单符号位表示变成双符号位:0=>00,1=>11
    • 双符号位产生的进位丢弃
    • 结果的双符号位不同则表示溢出

    例子4:A=-10010000, B=-11010000,求A+B

    A[补] = 11, 01110000
    B[补] = 11, 00110000
    A[补] + B[补] = (A + B)[补] = 10,10100000
    双符号位不同,表示溢出

    例子3:A=-10010000, B=-01010000,求A+B

    A[补] = 11,01110000
    B[补] = 11,10110000
    A[补] + B[补] = (A + B)[补] =11,00100000
    双符号位相同,没有溢出

    4. 整数减法

    A[补] − B[补] = 𝐴 + (−𝐵)[补](𝑚𝑜𝑑2^{𝑛+1})

    -B[补]等于B[补]连同符号位按位取反,末位加一
    B[补] = 1,0010101,(−B)[补] = 0,1101011

    例子5:A=11001000, B=-00110100,求A-B

    A[补] = A[原] = 0,11001000
    B[补] = 1,11001100
    (−B)[补] = 0,00110100
    A[补] − B[补] = A + (−B) [补]
    A + (−B) 补 = 0,11111100
    A − B = 111111100

    5. 小数减法

    A[补] − B[补] = 𝐴 + (−𝐵)[补](𝑚𝑜𝑑2)

    九、读点书的加减法运算

    x=S_x\times r^{j_x}
    y=S_y\times r^{j_y}

    • 对阶
    • 尾数求和
    • 尾数规格化
    • 舍入
    • 溢出判断

    x=0.1101 \times 2^{01}
    y=(-0.1010) \times 2^{11}

    1. 对阶

    対阶的目的是使得两个浮点数阶码一致,使得尾数可以进行运算

    • 浮点数尾数运算简单
    • 浮点数位数实际小数位与阶码有关
    • 阶码按小阶看齐大阶的原则
    对阶

    x=0.001101 \times 2^{11}
    y=(-0.1010) \times 2^{11}

    对阶

    2. 尾数求和

    • 使用补码进行运算
    • 减法运算转化为加法运算:A - B = A + (-B)

    x[原]=00.0011 \quad x[补]=00.0011
    y[原]=00.1010 \quad y[补]=11.0110

    S=(x+y)[补]=11.1001

    尾数求和

    3. 尾数规格化

    • 对补码进行规格化需要判断两种情况:S>0和S<0(符号位与最高位不一致)
      S[补]=00.1xxxxxx(𝑆 > 0)
      S[补] = 11.0xxxxxx(𝑆 < 0)
    • 如果不满足此格式,需要进行左移,同时阶码相应变化,以满足规格化

    S=(x+y)[补]=11.1001
    S=(x+y)[补]=11.(1)0010(左移)

    尾数规格化

    S=(x+y)[补]=11.0010
    S=(x+y)[原]=-0.1110
    (x+y)[原]=-0.1110 \times 2^{10}

    4. 尾数规格化(右移)

    • 一般情况下都是左移
    • 双符号位不一致下需要右移(定点运算的溢出情况)
    • 右移的话则需要进行舍入操作
    4.1 舍入
    • “0舍1入”法(二进制的四舍五入)

    S[补] = 10.10110111 \quad S[补] = 11.01011011(1)

    舍入

    可能溢出

    S[补] = 01.11111111 \quad S[补] = 00.10000000(1)

    两次右规
    4.2 溢出判断
    • 定点运算双符号位不一致为溢出
    • 浮点运算尾数双符号位不一致不算溢出(因为尾数双符号位可以进行右规)
    • 浮点运算主要通过阶码的双符号位判断是否溢出(如果规格化后,阶码双符号位不一致,则认为是溢出)

    例子:x = 0.11010011 × 2^{1101},𝑦 = 0.11101110 × 2^{1100},假设阶码4位,尾数8位,计算x + y

    对阶 尾数求和 尾数求和 判断溢出

    x+y[原]=x+y[补]=0.10100101 \times 2^{1110}

    5. 浮点数加减法运算

    image.png

    九、浮点数的乘除法运算

    1. 浮点数乘法

    浮点数乘法

    2. 浮点数除法

    浮点数除法 image.png

    例子:𝑥 = 0.11010011 × 2^{1101},𝑦 = 0.11101110 × 2^{0001},假设阶码4位,尾数8位,计算x * y

    x \times y = (S_x \times S_y) \times r^{(j_x+j_y)}\\ \qquad \qquad \qquad \qquad \qquad \quad = (0.11010011 × 0.11101110) × 𝑟^{1101+0001}\\ \qquad \qquad \qquad \quad = 0.11000100(保留八位) × 𝑟^{1110}

    十、巩固习题

    1.除了十进制以外,这个世界上常见的还有什么进制?

    二进制、八进制、十二进制、二十进制、六十进制。

    2.二进制一般使用什么方法转换成十进制?

    整数:按权展开法。

    3.十进制一般使用什么方法转换成二进制?

    整数:重复相除法,小数:重复相乘法。\

    4.计算机直接使用原码计算有什么缺点?

    0有两种表示方法,减法运算复杂。

    5.请计算12、124、1023、-1、-127的二进制原码。

    12(0,00001100)、124(0,01111100)、1023(0,1111111111)、-1(1,00000001)、-127(1,01111111)。

    6.计算机的补码解决了什么问题?

    相比原码的运算过程(特别是减法),补码对于计算机而言运算更加简单。

    7.请计算12、124、1023、-1、-127的补码,并将其使用32位定点表示法和32位浮点表示法(1位符号位、8位阶码、23位数值位)表示出来。

    8.你是否可以使用代码实现一个通用的计算器,可以将二进制数转换为十进制数,把十进制数转换为二进制数。

    9.计算机为了判断运算溢出使用了什么方法?

    双符号位判断法。当双符号位不一致表示溢出。

    10.什么是溢出?什么是上溢?什么是下溢?

    溢出即计算机无法表示数值。上溢是指数值绝对值大于表示范围,下溢是指计算机无法提供有效精度表示数值。

    11.对于64位浮点型(double),一般都是采用最高位为符号位,次高11位为指数位,其次52位为尾数,试求出double型所能表达的最大值和最小值。

    12.浮点数相比定点数,有什么优势?有什么不足的地方。

    浮点数可以表示更大的数据范围,但是运算耗时更长。

    13.浮点数之间做加减法运算需要几个步骤?每个步骤都是必须的吗?为什么?

    浮点数加减法需要经过以下几个步骤:对阶、尾数求和、尾数规格化、舍入、溢出判断。对阶是为了使得尾数可以进行运算,阶码不一致尾数运算无效,尾数规格化、舍入是为了正确存储结果,溢出判断是为了判断运算过程是否有误,如果溢出将会发出信号进行溢出处理。

    14.x=0.1101^1001, y=0.1011^110,请计算x+y的值,x-y的值。

    x+y=0.11100111001,x-y=0.10111011001。

    15.x=0.1101^111, y=-0.1111^1101,请计算x+y的值,x-y的值。

    x+y=-0.11101100111101,x-y=0.11110011011101。

    相关文章

      网友评论

          本文标题:计算机组成原理之计算篇

          本文链接:https://www.haomeiwen.com/subject/endcbktx.html