深剖整型與浮點型數據在內存中的存儲

深度剖析整型與浮點型數據在內存中的存儲

衆所周知,不同的數據類型,其在內存當中的存儲就可能有所差異。
而在內置類型裏:int, char, short, long,  float, double等等,因其所佔據的內存不同,其相應類型的數據存儲就存在差異。
1.整型在內存中的存儲:
整型數據包括:int, short, char, long等等。
int在內存中開闢4個字節,short在開闢2個字節,char開闢1個字節,long在32位系統內開闢4個字節,在64位系統內部開闢8個字節。
計算機中的符號數有三種,原碼,反碼,補碼。
正數的原反補碼都相同;負數的反碼爲其原碼符號位不變,其餘位次取反;補碼則爲在反碼的基礎上加1。
對於整型來說,數據在內存中存儲的都是其補碼。


由上圖不難看出,數據在內存中是以補碼的方式進行存儲的。
但觀察其在內存中的存儲不難發現,數據的低位保存在低地址中,高位保存在高地址中。這種存儲方式即爲小端字節序。
而當數據的低位保存在高地址中,高位保存在低地址中時,即爲大端字節序。

2.浮點型在內存中的存儲:
常見的浮點類型包括:float, double,long double等。 
float在內存中分配4個字節,double分配8個字節,long double分配8個字節。
針對浮點型,根據國際標準IEEE(電氣和電子工程協會) 754,任意一個二進制浮點數V可以表示成下面的形式:
· (-1)^S*M*2^E
· (-1)^s表示符號位,當s=0,V爲正數;當s=1,V爲負數。
· M表示有效數字,大於等於1,小於2。
· 2^E表示指數位。
舉例來看:
float num = 10.0;
二進制表示爲1010.0,即相當於1.010*2^3。
按照上面的格式即 S=0,M=1.010,E=3。
IEEE754規定有:
對於32位的浮點數,最高一位爲符號位s,緊接着的8位爲指數位E,剩餘的23位爲有效數字M。

對於64位的浮點數,最高的1位是符號位S,接着的11位是指數E,剩下的52位爲有效數字M。

IEEE 754對有效數字M和指數E,還有一些特別規定。
IEEE 754規定,在計算機內部保存M時,默認這個數的第一位總是1,因此可以被捨去,只保存後面的xxxxxx部分。
比如保存1.01的時候,只保存01,等到讀取的時候,再把第一位的1加上去。
這樣做的目的,是節省1位有效數字。以32位浮點數爲例,留給M只有23位,將第一位的1捨去以後,等於可以保存24位有效數字。
另外,關於指數E也存在三種情況:
首先,指數E爲這意味着,如果E爲8位,它的取值範圍爲0~255;如果E爲11位,它的取值範圍爲0~2047。
IEEE 754規定,存入內存時E的真實值必須再加上一個中間數。
對於8位的E,這個中間數是127;對於11位的E,這個中間數是1023。
比如,2^10的E是10,所以保存成32位浮點數時,必須保存成10+127=137,即10001001。
1.E不全爲0或1
此時,按照常規,對E減去127或1023,在進行運算。
2.E全爲0
這時,浮點數的指數E等於1-127(或者1-1023)即爲真實值,有效數字M不再加上第一位的1,而是還原爲0.xxxxxx的小數。這樣做是爲了表示±0,以及接近於0的很小的數字。
3.E全爲1
這時,如果有效數字M全爲0,表示±無窮大(正負取決於符號位s)。
舉例來看:

分析有,十六進制 41200000 ,二進制表示即爲:0 10000010 0100000 00000000 00000000
發佈了41 篇原創文章 · 獲贊 82 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章