c語言單精度和雙精度存儲方式以及移位存儲的優(yōu)點

存儲方式

方式 位數(shù) 標(biāo)準(zhǔn) 模式
float 32bit IEEE R32.24
float.png
double 64bit R64.53
double.png
  1. 符號位(Sign):0代表正,1代表為負(fù)瘫俊;
  2. 指數(shù)位(Exponent):用于存儲科學(xué)計數(shù)法中的指數(shù)數(shù)據(jù),并且采用移位存儲;
  3. 尾數(shù)部分(Mantissa):尾數(shù)部分

R32.24和R64.53的存儲方式都是用科學(xué)計數(shù)法來存儲數(shù)據(jù)的
用二進(jìn)制的科學(xué)計數(shù)法第一位都是1穷当,可以將小數(shù)點前面的1省略,所以23bit的尾數(shù)部分淹禾,可以表示的精度卻變成了 24bit馁菜,道理就是在這里。

那24bit能精確到小數(shù)點后幾位呢铃岔,我們知道9的二進(jìn)制表示為1001汪疮,所以4bit能精確十進(jìn)制中的小數(shù)點后一位,24bit就能使float能精確到小數(shù)點后6位,而對于指數(shù)部分智嚷,因為指數(shù)可正可負(fù)躲胳,8位的指數(shù)位能表示的指數(shù)范圍就應(yīng)該為:-127-128了, 所以指數(shù)部分的存儲采用移位存儲纤勒,存儲的數(shù)據(jù)為元數(shù)據(jù)+127坯苹。

下面就看看8.25和120.5在內(nèi)存中真正的存儲方式:

8.25換算成二進(jìn)制科學(xué)計數(shù)法

8 = 1000;
0.25 = 0.01;

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

  
按照上面的存儲方式
符號位為   0,表示為正摇天;
指數(shù)位為   3+127=130粹湃,
尾數(shù)部分為 00001 = 00001000000000000000000 //23位
故8.25的存儲方式如下:
0--10000010--00001000000000000000000  
即01000001000001000000000000000000 


#同理

120.5在內(nèi)存中的存儲格式如下 
0--10000101--11100010000000000000000

即01000010111100010000000000000000 
 

那么如果給出內(nèi)存中一段數(shù)據(jù),并且告訴你是單精度存儲的話泉坐,你如何知道該數(shù)據(jù)的十進(jìn)制數(shù)值 呢为鳄?其實就是對上面的反推過程,比如給出如下內(nèi)存數(shù)據(jù):

01000001001000100000000000000000 
第一步:符號位為0腕让,表示是正數(shù)孤钦;  
第二步:指數(shù)位為10000010,換算成十進(jìn)制為130纯丸,所以指數(shù)為130-127=3偏形; 
第三步:尾數(shù)位為01000100000000000000000,換算成十進(jìn)制為 (1+1/4+1/64);
#尾數(shù)部分都要+1  
十進(jìn)制數(shù)值為:2^3*(1+1/4+1/64)=8+2+1/8=10.125

移位存儲的詳解

以32位單精度float內(nèi)存模型為例

float-struct.png

從上圖可以看出 指數(shù)部分8位存儲空間實際上并不在意同一個字節(jié)上觉鼻,通常情況下8位存儲空間可以存儲的數(shù)值范圍為

0000000 0 ~ 1111111 1

也就是從0開始到 255結(jié)束俊扭,一共 256個數(shù)。

但是新組成的8位數(shù)是用來表示整串32位單精度浮點數(shù)的冪指數(shù)(階碼)的坠陈,而浮點數(shù)的冪指數(shù)(階碼)是有必要使用負(fù)數(shù)的萨惑。

既要表示正數(shù),又要表示負(fù)數(shù)仇矾,因此我們要拿出一位來表示正負(fù)號庸蔼,通常都是拿一個字串最左邊的那位即最高位來表示正負(fù)號的,使用傳統(tǒng)的方式贮匕,即一個字節(jié)的最高位(最左邊那位)為1時表示負(fù)數(shù)姐仅,那么我們可以得到兩個區(qū)間,這里我們?yōu)榱丝粗奖氵€是使用空格來隔開最高位的符號位和最低位的那位特殊位:

第一個區(qū)間:

0 000000 0~ 0 111111 1

即+ 0 到 127粗合,

第二個區(qū)間:

1 000000 0~ 1 111111 1

即 -0 到 - 127萍嬉,

這里出現(xiàn)了2個0,一個正+0隙疚,一個-0

使用移位存儲方式會有什么效果呢? 移位存儲要+127 , 存儲示例:

127 使用這個新生成的字節(jié)來表示壤追,則是:

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位二進(jìn)制移位存儲算法表示的最大的正數(shù)了悼做,再大就溢出了疯特。 同樣,我們來看看負(fù)數(shù):

我們要表示 -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位二進(jìn)制采用移位存儲所能表示的最小的負(fù)數(shù)了邻吞,再小就溢出。

由上面的 例子葫男,我們可以得出規(guī)律抱冷,采用移位存儲技術(shù),我們可以使用 8位二進(jìn)制來表示從 -127~128 共計:

127個負(fù)數(shù)+零(0)+128個正數(shù)=256個數(shù)

看來使用移位存儲即沒有+0和-0的問題梢褐,又充分的使用這個新生成的 8位二進(jìn)制數(shù)來最大限度的表示單精度浮點數(shù)的冪指數(shù)(階碼)旺遮,是非常合理的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盈咳,隨后出現(xiàn)的幾起案子耿眉,更是在濱河造成了極大的恐慌,老刑警劉巖猪贪,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跷敬,死亡現(xiàn)場離奇詭異讯私,居然都是意外死亡热押,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門斤寇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桶癣,“玉大人,你說我怎么就攤上這事娘锁⊙滥” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵莫秆,是天一觀的道長间雀。 經(jīng)常有香客問我,道長镊屎,這世上最難降的妖魔是什么惹挟? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮缝驳,結(jié)果婚禮上连锯,老公的妹妹穿的比我還像新娘归苍。我一直安慰自己,他們只是感情好运怖,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布拼弃。 她就那樣靜靜地躺著,像睡著了一般摇展。 火紅的嫁衣襯著肌膚如雪吻氧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天咏连,我揣著相機與錄音医男,去河邊找鬼。 笑死捻勉,一個胖子當(dāng)著我的面吹牛镀梭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踱启,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼报账,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了埠偿?” 一聲冷哼從身側(cè)響起透罢,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冠蒋,沒想到半個月后羽圃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡抖剿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年朽寞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斩郎。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡脑融,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缩宜,到底是詐尸還是另有隱情肘迎,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布锻煌,位于F島的核電站妓布,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宋梧。R本人自食惡果不足惜匣沼,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乃秀。 院中可真熱鬧肛著,春花似錦圆兵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至局荚,卻和暖如春超凳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耀态。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工轮傍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人首装。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓创夜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仙逻。 傳聞我的和親對象是個殘疾皇子驰吓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容