计算机组成原理之计算篇

一、章节导学

章节导学

二、进制运算的基础

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。

你可能感兴趣的:(计算机组成原理之计算篇)