2.运算方法和运算器
2.运算方法和运算器
2.1 数据与文字的表示方法
2.1.1 数据格式
在选择计算机的数的表示方式时,需要考虑以下几个因素:
- 要表示的数的类型(小数,整数,实数,复数)
- 可能的数值范围
- 数值精确度
- 数据存储和处理所需要的硬件代价
计算机中常用的数据表示格式有两种,一是定点格式,二是浮点格式。一般来说,定点格式容许的数值范围有限,要求的处理硬件比较简单。而浮点格式容许的数值范围很大,要求的处理硬件比较复杂。
-
定点数的表示方法
所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。由于约定在固定的位置,小数点就不再使用记号
.
来表示。理论上讲,小数点的位置固定在哪一位都可以,但是通常将数据表示成纯小数或纯整数假设用一个n+1位字来表示一个定点数x,其中一位\(x_n\)用来表示数的符号,其余位数代表它的量值。为了将整个\(n+1\)位统一处理,符号位\(x_n\)放在最左位置,并用数值0和1分别代表正号和负号,这样,对于任意定点数\(x=x_nx_{n-1}...x_1x_0\),在定点机中可表示为:数符+n位尾数。
- 如果数x表示的是纯小数:\(0 \leqslant |X| \leqslant 1-2^{-n}\)
- 如果数x表示的是纯整数:\(0 \leqslant 2^n-1\)
目前计算机中多采用定点纯整数表示,因此将定点数表示的运算简称为整数运算。
-
浮点数的表示方法
我们在计算机中存储数据还有这样一种形式:把一个数的有效数字和数的范围在计算机中的一个存储单元中分别予以表示。这种把数的范围和精度分别表示的方法,相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法。
任何一个十进制数\(N\)可以写成
\[N = 10^E * M \]同样,在计算机中任何一个二进制数可以写成
\[N = 2^e * M \]其中,M称为浮点数的尾数,是一个纯小数。\(e\)是比例因子的指数,称为浮点数的指数,是一个整数。比例因子的基数2对二进记数制
的机器是一个常数。
在机器中表示一个浮点数时:
- 要给出尾数,用定点小数表示。尾数部分给出有效数字的位数,因而决定了浮点数的表示精度。
- 要给出指数,用整数形式表示,称为阶码,阶码指明小数点在数据中的位置,因而决定了浮点数的表示范围。
- 浮点数也要有符号位
在机器中,浮点数通常都采用统一的\(IEEE754\)标准(读作"I triple E标准")的格式存储。IEEE754标准规定的32位短浮点数的标准格式为:
-
31位存储数符,3023位存储阶码,220位存储尾数
32位浮点数中,S是浮点数的符号位,占1位,安排在最高位,S=0表示正数,S=1表示负数。
浮点数的规格化表示:当尾数域的值不为0时,尾数域的最高有效位应为1。
在IEEE754标准中,一个规格化的32位浮点数x的真值为
\[x = (-1)^S\times (1.M) \times 2^{E-127}, e = E-127 \]此外,IEEE754定义:
- 若E=255(\(2^8-1\),即阶码全为1)且M不为0,则N=NaN。
- 若E=255且M=0,则N=\((-1)^S\infin\)。当阶码E全为1且尾数M全为0时,表示无穷大;结合符号位S可以表示正无穷和负无穷。
- 若E=0且M=0,则N=\((-1)^S0\)。当阶码全为0且尾数0也全为0时,表示真值0。同样也有正0和负0之分。
- 若E=0且M不为0,则表示非规格化数\(N=(-1)^S\times(0.M)\times 2^{-126}\)
例题:若浮点数x的IEEE754标准存储格式为\((41360000)_{16}\)求其浮点数的十进制数值。
41360000\(\to\) 0100,0001,0011,0110,0000,0000,0000,0000
S = 0
E = 1000,0010 即 \(2^1 + 2^7 = 2 + 128 = 130\)
M = 0110,1100,0000,0000,0000,000
x = \((-1)^0 \times 2^{E-127} \times (1.0110,1100) = 1.00101100 << 3 =1001.0100 = (11.375)_{10}\)
2.1.2 数的机器码表示
-
原码表示法
若定点整数的原码形式为\(x_nx_{n-1}x_{n-2}...x_1x_0\),则原码表示的定义是
\[[x]_{原}=\left\{ \begin{align} & x, \ \ \ 0 \leqslant x \lt 2^n\\ &2^n-x = 2^n + |x|, \ \ \ -2^n \lt x \leqslant \end{align} \right. \]其中\([x]_{原}\)是机器数,\(x\)是真值
-
补码表示法
将负数用补码表示,可以将减法表示为加法,即\(x-y = x + [y]_{补}\)
对于定点整数,补码形式为\(x_nx_{n-1}...x_1x_0\),\(x_n\)为符号位,则补码表示的定义是
\[[x]_{补}= \left\{ \begin{align} & x, 2^n \gt x \geqslant 0 \\ & 2^{n+1} + x = 2^{n+1} - |x|, \end{align} \right. \]补码表示的真值:
\[x = -2^n x_n + x_{n-1}x_{n-2}...x_1x_0 \]e.g1:\([x]_{补}=010011011, x = 10011011 = (155)_{10}\)
e.g2:\([x]_{补}=110011011, x = -2^8 + 10011011 = -256 + 155 = -101\)
2.2 定点加法、减法运算
2.2.1 补码加法
将负数用补码表示后,就可以和正数一样来处理。这样,运算器里只需要一个加法器就可以了,不必为了负数的加法运算,再配一个减法器。
补码的加法公式是
补码加法的特点:一是符号位要作为数的一部分一起参与运算,而是要在模\(2^{n+1}\)的进位要丢掉。
2.2.2 补码减法
由\([y]_{补}\)求\([-y]_{补}\)的法则是:对\([y]_{补}\) 包括符号位,各位取反,末位加1。
总结:
原码求补码:
- 正数: \([x]_{原} = [x]_{反} = [x]_{补}\)
- 负数:先求反码,再求补码。\([x]_反 = [x]_{原}符号位不变,其余位取反。[x]_{补} = [x]_{反}+1\)。