[音乐] 上一讲提到:为了解决数据中小数点的表示问题
可以在计算机中用固定小数点位置的定点数表示数据
也可以用浮点数表示数据,在浮点数中 通过一个定点整数来指定小数点位置
通过一个定点小数来指定有效数字 即用两个定点数表示一个浮点数,因此
数值数据的表示问题实际上就是定点数的编码表示问题
那么定点数有哪几种编码方式呢 本讲主要介绍三种定点数的编码表示
[无声]
这是我们上一讲讲到的数值数据的表示
那么数值数据它有三个要素:有进位计数制,定、 浮点表示和定点数的编码
因为浮点数可以用一个定点小数和一个定点整数来表示 所以我们最终解决的编码问题是定点数的编码问题
而定点数的编码问题,这里面要解决一个正负号的问题 定点数的编码有这样几种:原码、
补码 移码和反码,而反码呢,在机器里面很少用了现在
后面主要介绍原码、 补码和移码的表示
最简单的是原码表示 原码的表示方式非常简单,也就是说对于
符号为正的数据,正数对应的原码表示
其符号就用0表示,对应于负数 其符号就用1来表示
数值部分不变,比如说0,数值部分就是000,1就是001
7就是111,那么正7就是0111,-7就是1111
数值部分是不变的,那么这种原码表示的方式
很简单,很容易理解,跟我们现实生活当中表示基本上是对应的
正号改成0,负号改成1,其他的数值 部分用二进制来表示,很容易理解
但是它有几个缺点,第一,0的表示不唯一
那么正0是0000,负0是1000,所以它的表示是不唯一的
因此,程序员的编程是比较麻烦的
此外它的加减运算不统一,不能像后面我们介绍的补码那样
把减法用加法来实现
那么对应异号数的相减,或者是对应同号数相减
或者异号数相加,它的运算比较复杂
它必须判定这两个数据的绝对值哪个大哪个小,然后用绝对值更大的
数值减去绝对值更小的那个数值 结果的符号取绝对值大的那个数的符号
所以要实现这样的一个运算规则,在机器里面比较麻烦
另外对符号位的处理也需要另外的处理 就像我们刚才讲的,同号数相减、 异号数相加的时候
我们先进行数值部分的运算 拿大数减小数,然后符号要另外的判断
所以硬件设计也不是很方便,所以从五十年代开始
整数基本上都用补码表示,而不用原码表示
但是浮点数的尾数目前还是用原码定点小数来表示 那么前面我们介绍了原码。
在计算机当中 还有一个定点数的编码表示就是移码的表示
移码很简单,它是把一个真值,一个数值
加上一个偏置常数得到的一个值 把它转换成二进制对应的这个编码就是移码表示
那么比如说,当这个编码位数 是n位的时候,这个偏置常数通常是
取2的n-1次方或者2的n-1(次方)再减1 次方,比如说IEEE
754,我们后面要讲到的这个浮点数的标准 它就是取后面的这个偏置常数
当n=4的时候,我们来举个例子,那么n=4的时候,它的偏置常数
可以是2的3次方,4减1是3 那么这个偏置常数加上这个真正的值
真值就得到它的编码表示,就是它的移码表示 比如说,这个数是-8
加上一个偏置常数8,也就是2的3次方8
它真正的在机器里面的编码表示就是0000
-7这个值加上偏置常数得到的 编码表示,就是这边的这个移码表示,就是0001
正7加上偏置常数8得到的是15
15对应的二进制就是1111 四位数1111,所以这个-8
对应的是0000,-7对应的是0001,正7对应的是1111
那么这个左边就是真值,右边就是它的移码表示
在移码表示当中,这个移码 0的移码表示是唯一的,也就是正0还是负0
加上偏置常数8以后都得到8,都是1000 所以它完全是唯一的, 那么当这个偏置常数
取2的n-1次方的时候,移码和补码 是数值位完全一样,仅符号位不同
仅仅是符号位不同,对于补码来说,正7的补码实际上它是0111
所以第一位不一样,那么0的补码它就是0000,也是第一位不一样
负8的补码是1000,所以也是第一位不一样 这样我们可以看出移码和补码之间的关系
移码用来表示浮点数的阶 也就是移码的值说明这个小数点的位置的
为什么要用移码来表示浮点数的阶呢 表示浮点数的指数呢?主要是用于
浮点数进行加减运算时候的对阶操作 对阶是要比较大小的,比如说我们拿这个数和这个数相加
那么我们知道在科学计数法当中,进行加法的时候
我们一定是看这个阶用小阶向大阶看齐
我们要把这个前面这个数的这个 阶码也变成2的3次方,这样才能把前面的这个
尾数部分进行相加,所以我们要比较-1和3哪个大哪个小
然后把阶小的那个数进行这个移位
它的这个尾数部分进行移位,那么,如果我们用补码来表示
然后来比较大小的话,-1的补码是111,3的补码是011
假定我们用三位补码来表示的话,那么很显然 在机器里面我们去比较这两个数的时候
如果是我们直接从左边往右边比的话 我们得到的结论是111比011大
因为111它的真正的值是 这是一个二进制的序列,这是一个二进制的0、
1序列,那么左边的这个是7,右边的这个是3 7是大于3的,所以它的结论并不是前面的小后面的大
所以为了简化比较,我们就把这个
所有的这个阶,就是这个指数 加上一个偏置常数,比如-1加4,这个偏置常数
如果这个移码位数等于3的话,它的偏置常数就是2的
2次方,2的3减1次方也就是2的2次方,也就是4
那么4加上负1就是3, 4加上3就是7
你这样的话去比的时候,就很容易的看到,得到前面的数是小于后面的数
所以移码是主要为了对这个阶进行比较而引入的
计算机里面也用移码来表示浮点数的阶
[音乐]