c语言单精度和双精度存储方式以及移位存储的优点

存储方式

方式 位数 标准 模式
float 32bit IEEE R32.24
float.png
double 64bit R64.53
double.png
  1. 符号位(Sign):0代表正,1代表为负;
  2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储;
  3. 尾数部分(Mantissa):尾数部分

R32.24和R64.53的存储方式都是用科学计数法来存储数据的
用二进制的科学计数法第一位都是1,可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了 24bit,道理就是在这里。

那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的小数点后一位,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了, 所以指数部分的存储采用移位存储,存储的数据为元数据+127。

下面就看看8.25和120.5在内存中真正的存储方式:

8.25换算成二进制科学计数法

8 = 1000;
0.25 = 0.01;

8.25(10) = 1000.01(2) = 1.00001*2^3 

  
按照上面的存储方式
符号位为   0,表示为正;
指数位为   3+127=130,
尾数部分为 00001 = 00001000000000000000000 //23位
故8.25的存储方式如下:
0--10000010--00001000000000000000000  
即01000001000001000000000000000000 


#同理

120.5在内存中的存储格式如下 
0--10000101--11100010000000000000000

即01000010111100010000000000000000 
 

那么如果给出内存中一段数据,并且告诉你是单精度存储的话,你如何知道该数据的十进制数值 呢?其实就是对上面的反推过程,比如给出如下内存数据:

01000001001000100000000000000000 
第一步:符号位为0,表示是正数;  
第二步:指数位为10000010,换算成十进制为130,所以指数为130-127=3; 
第三步:尾数位为01000100000000000000000,换算成十进制为 (1+1/4+1/64);
#尾数部分都要+1  
十进制数值为:2^3*(1+1/4+1/64)=8+2+1/8=10.125

移位存储的详解

以32位单精度float内存模型为例

float-struct.png

从上图可以看出 指数部分8位存储空间实际上并不在意同一个字节上,通常情况下8位存储空间可以存储的数值范围为

0000000 0 ~ 1111111 1

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

但是新组成的8位数是用来表示整串32位单精度浮点数的幂指数(阶码)的,而浮点数的幂指数(阶码)是有必要使用负数的。

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

第一个区间:

0 000000 0~ 0 111111 1

即+ 0 到 127,

第二个区间:

1 000000 0~ 1 111111 1

即 -0 到 - 127,

这里出现了2个0,一个正+0,一个-0

使用移位存储方式会有什么效果呢? 移位存储要+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位二进制采用移位存储所能表示的最小的负数了,再小就溢出。

由上面的 例子,我们可以得出规律,采用移位存储技术,我们可以使用 8位二进制来表示从 -127~128 共计:

127个负数+零(0)+128个正数=256个数

看来使用移位存储即没有+0和-0的问题,又充分的使用这个新生成的 8位二进制数来最大限度的表示单精度浮点数的幂指数(阶码),是非常合理的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容