浮点数在内存中的表示移位存储难点的理解

来源:互联网 发布:淘宝怎么联系不了卖家 编辑:程序博客网 时间:2024/05/21 14:51

原文地址:http://blog.csdn.net/michaelhan3/article/details/72802104


我们知道,单精度浮点数,在内存中是使用32位存储;那么这8位组成的新的字节,我们来用下面的一串数字;00000000;对的,实际上这个就是浮点数幂指数(阶码)的存储空;首先,我们假设不使用移位存储(就是大家最头痛,最;00000000;开始,到;11111111;结束,也就是从0开始到255结束,一共256个.


今天这里跟大家分享一下对于浮点数在内存中幂指数(也有叫阶码的)为何采用移位存储的这个难点个人的理解,如有错误,请大家不吝赐教及时指正不要误人子弟。 其实关于这个移位存储的问题真的是第一次从计算机相关的书籍上看到关于浮点数开始就一直困扰着我,直到前天在公车上我无意中想到了问题的关键,原因很简单大家只要多写出几个数就明白了,通过浮点数这个移位存储理解难点的事情,我们应该在今后的学习中养成多问自己几个为什么的好习惯,而不是照本宣科,其实无论计算机多么的高级,毕竟是由人脑发明的,它运算的再快,也是讲道理的,所以大家不要知难而退,要迎头赶上,希望我的这个思路能帮助还在浮点数移位存储为什么中迷茫的同学们一点儿启示,谢谢大家,祝大家学习工作愉快,努力学好科学文化知识,争做祖国的栋梁之材。废话不多说了,请看下面:

我们知道,单精度浮点数,在内存中是使用32位存储的,并且后23位(整串32位数的低位)作为表示“尾数”来使用的,那么32-23=9位,这9位(整串32位数中的高位)中最左边的第一位(整串32位数中的最高一位)是用来表示这个浮点数的正负的,那么9-1=8位,正好是一个字节的长度(请注意这里虽然是正好是一个字节的长度,但是实际上这8位并不在顺序中的同一个字节内,因为整串32个位数最高位用来表示浮点数的正负,这8位是由整串32位数中左数第一个即最高的那个字节的后7位,加上左数第二个字节的第一位合体组成的),而且移位存储就是使用了这8个位组成的新的字节。所以我们可以先忽略整串32位数最高一位(最左边的那一位)和低23位(即整串32位数从右边数23位),只考虑由整串32位数的左数第一个字节的后七位和整串32位数的左数第二个字节的最高位(左数第一位)一同组成的新8位的这个字节,排除干扰,我们的问题就清晰,容易理解多了。

那么这8位组成的新的字节,我们来用下面的一串数字表示,这个新字节最后一位因为实际上是整串32位数左数第二个字节的最高位(左数第一位),因此我们使用一个空格来隔开它,这样大家看的更清楚直观一些,请看。

0000000 0

对的,实际上这个就是浮点数幂指数(阶码)的存储空间,那么它能表示多少个数,或者说能表示多大的数呢,我们接着来看一下。

首先,我们假设不使用移位存储(就是大家最头痛,最难理解的,本文的核心)技术,而是单单看看这个 7位+1位组成的新字节,到底能表示多少个数,这个问题就太简单了,我想大家闭着眼睛都能查出来,没错是从

0000000 0

开始,到

1111111 1

结束,也就是从0开始到 255结束,一共 256个数。

但是,我们知道这新组成的8位数是用来表示整串32位单精度浮点数的幂指数(阶码)的,而浮点数的幂指数(阶码)是有必要使用负数的,大家都知道,当幂指数(阶码)为正时,整

串32位单精度浮点数的小数点是向右移动的,表示的数的绝对值就大一些,同样我们在使用计算机时也需要使用到绝对值很小的数,因此,我们需要将整串32位数的小数点向左移动,从而将整串32位单精度浮点数的绝对值变的更小,那么就需要幂指数(阶码)为负数,好了,我们接下来看。

既然这个新生成的字节,既要表示正数,又要表示负数,因此我们要拿出一位来表示正负号,而且大家都知道,一般都是拿一个字串最左边的那位即最高位来表示正负号的,因此,我们也沿袭这个规矩,其实这个也很好理解,因为这个新字节表示的是一个范围内的数,因此,最右一位是一直在变化的,而最高位(最左边那位)一般只有两个状态当为0时,剩下的7位可以表示的范围从0到127,当最高位(最左边那位)为1时,配合剩下的7位可以表示128到255,当然这里我们还是把这新字节的8位都用来表示数,而没有拿出1位来表示符号。

好的,既然我们拿出这个新字节的最高位(最左边的那位)来当符号位,而且看来很合适,那么我们来看看这个符号位,是用1来表示负数(常规做法)好不好,合理不合理。

首先,我们使用传统的方式,即一个字节的最高位(最左边那位)为1时表示负数,那么我们可以得到两个区间,这里我们为了看着方便还是使用空格来隔开最高位的符号位和最低位的那位特殊位:

第一个区间:

0 000000 0~ 0 111111 1

即+ 0 到 127,

第二个区间:

1 000000 0~ 1 111111 1

即 -0 到 - 127,

大家看到这里发现问题了,怎么有两个零,一个正零,一个负零呢,好啦,我们再马上来看看使用移位存储方式会有什么效果,我们知道移位存储我们要加 127,为什么要加127,大家看看下面的例子就明白了,请看:

127 使用这个新生成的字节来表示,则是:

0 111111 1 ,

我们来多举几个例子,大家马上就明白了,请看:

如果我们要表示 0,则有 0+127=127 即 0 111111 1

0 000000 0 + 0 111111 1= 0 111111 1

我们要表示1,则有 1+127=128 即 1 000000 0

0 000000 1 + 0 111111 1= 1 000000 0

我们要表示 2,则有 2+127=129 即 1 000000 1

0 000001 0 + 0 111111 1= 1 0000001

………………………………………………………………

我们要表示 128,则有 128+127=255 即 1 111111 1

1 000000 0+ 0 111111 1= 1 111111 1

这个128是我们能够使用 8位二进制移位存储算法表示的最大的正数了,再大就溢出了。 同样,我们来看看负数:

我们要表示 -1时,则有( -1) +127=127-1=126 即 0 111111 0

0 111111 1 - 0 000000 1= 0 111111 1

我们要表示 -2时,则有( -2)+ 127=127-2=125 即 0 111110 1

0 111111 1 - 0 000001 0= 0 111110 1

……………………………………………………………………………………………… 我们要表示 -127时,则有(-127)+127=127-127=0 即 0 000000 0

0 111111 1 - 0 111111 1= 0 000000 0

这-127,是我们能够使用 8位二进制采用移位存储所能表示的最小的负数了,再小就溢出。

由上面的 7个例子,我们可以得出规律,采用移位存储技术,我们可以使用 8位二进制来表示从 -127~128 共计 127个负数+零(0)+128个正数总共 256个数,看来使用移位存储即没有+0和-0的问题,又充分的使用这个新生成的 8位二进制数来最大限度的表示单精度浮点数的幂指数(阶码),是非常合理的,只是这里大家需要注意,在使用移位存储技术时,得到的两个区间:

0 000000 0~ 0 111111 1

这里不严谨的称之为 0区间,在0区间内表示 -127~0 ,0包含在此区间。

0 000000 0表示的是 -127 而不是0,

0 111 111 1表示的是0 而不是 +127,

1 000000 0~ 1 111111 1

这里我们称之为 1区间,在1区间内表示的是 1~128,

所以,在使用移位存储技术的时候,这个8位新字节中最高位的符号位是1,表示的是正数,而当最高位的符号位是0时,表示的是0 和负数的集合。

综上所述,就是个人对浮点数幂指数(阶码)移位存储知识点的理解,请大家批评指正,希望能帮助到更多想通过自己的努力来改变命运的莘莘学子们,加油。


原创粉丝点击