本文主要是介绍float为什么要进行 移位存储或者说移位存储有什么好处?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转载:https://blog.csdn.net/michaelhan3/article/details/72802104
首先,我们假设不使用移位存储技术,而是单单看看这个 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
………………………………………………………………//正数的符号位为1
我们要表示 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位二进制采用移位存储所能表示的最小的负数了,再小就溢出。
………………………………………………………………//负数符号位为0
我们可以得出规律,采用移位存储技术,我们可以使用 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 和负数的集合。
这篇关于float为什么要进行 移位存储或者说移位存储有什么好处?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!