float 在記憶體中的儲存方式
c語言中,對於浮點型別的資料採用單精度型別(float)和雙精度型別(double)來儲存,float資料占用32bit, double資料占用
64bit,我們在宣告乙個變數float f= 2.25f的時候,是如何分配記憶體的呢?如果胡亂分配,那世界豈不是亂套了麼,其實不論是
float還是double在儲存方式上都是遵從ieee的規範的,float遵從的是ieee r32.24 ,而double 遵從的是r64.53。
無論是單精度還是雙精度在儲存中都分為三個部分:
1. 符號位(sign) :0代表正,1代表為負
2. 指數字(exponent):用於儲存科學計數法中的指數資料,並且採用移位儲存
3. 尾數部分(mantissa):尾數部分
其中float的儲存方式如下圖所示:
而雙精度的儲存方式為:
r32.24和r64.53的儲存方式都是用科學計數法來儲存資料的,比如8.25用十進位制的科學計數法表示就為:8.25*10^0 ,而120.5
可以表示為:1.205*10^2 , 這些小學的知識就不用多說了吧。而我們傻蛋計算機根本不認識十進位制的資料,他只認識0,1,所以在計算機儲存中,首先要將上面的數更改為二進位制的科學計數法表示,8.25用二進位制表示可表示為1000.01,我靠,不會連這都
不會轉換吧?那我估計要沒轍了。120.5用二進位制表示為:1110110.1用二進位制的科學計數法表示1000.01可以表示為1.0001*2^3 ,
1110110.1可以表示為1.1101101*2^6 ,任何乙個數都的科學計數法表示都為1.**** 2^n, 尾數部分就可以表示為***x,第一位都是1嘛,幹嘛還要表示呀?可以將小數點前面的1省略,所以23bit的尾數部分,可以表示的精度卻變成了 24bit,而對於指數部分,因為指數可正可負,8位的指數字能表示的指數範圍就應該為:-127-128了,所以指數部分的儲存採用移位儲存,儲存的資料為元資料+127,
下面就看看8.5和120.5在記憶體中真正的儲存方式。
首先看下8.5,用二進位制的科學計數法表示為:1.0001*2^3
按照上面的儲存方式,符號位為:0,表示為正,指數字為:3+127=130 ,位數部分為,故8.5的儲存方式如下圖所示:
而單精度浮點數120.5的儲存方式如下圖所示:
下面說下取值範圍和精度:
取值範圍看指數部分:
float是有符號型,其中,8位指數字,2^8=(-128—127),因此實際的範圍是-2^128—2^127,約為-3.4e38—3.4e38
同理double範圍約是-1.7e308—1.7e308,
精度是看尾數部分:
float尾數字23位,2^23=8.3e6,7位,所以不同的編譯器規定不同,有些是7位,有些8位
double尾數52位,2^52=4.5e15,15位,所以double的有效位數是15位
float在記憶體中的儲存方式
精度常用的資料結構的位元組數由平台決定,可以用sizeof 方法檢視,例如,在x86平台上,如下 sizeof int 4sizeof short 2sizeof long 4sizeof float 4sizeof double 8sizeof char 1sizeof word 2 sizeof...
float在記憶體中儲存方式
依據ieee規定 float在儲存中都分為三個部分 符號位 sign 0代表正,1代表為負 指數字 exponent 用於儲存科學計數法中的指數資料,並且採用移位儲存 尾數部分 mantissa 尾數部分 其中floa和doublet的儲存方式如下圖所示 8.25用十進位制的科學計數法表示就為 8....
float在記憶體中的儲存
以下內容來自於 1.十進位制轉二進位制 1.1整數 11 2 5 餘 1 5 2 2 餘 1 2 2 1 餘 0 1 2 0 餘 1 0結束 11二進位制表示為 從下往上 1011 1.2小數 0.9 2 1.8 取整數部分 1 0.8 1.8的小數部分 2 1.6 取整數部分 1 0.6 2 1....