1. 程式人生 > >整形數int、浮點型資料float,在記憶體中儲存的表示

整形數int、浮點型資料float,在記憶體中儲存的表示

引言: 突然想到一個底層問題。
計算機組成原理裡學的:定點整數 定點小數 浮點數;
程式設計裡的基本資料型別int float在記憶體中的儲存形式;
二者究竟的對應關係是?
CSDN部落格裡有這樣一句話,“實數在記憶體中以規範化的浮點數存放”,請先理清“實數”是多大範圍再回味這句話!
我在書上看到這樣一句話,“一般高檔微機以上的計算機中同時採用定點、浮點表示,由使用者進行選擇,而微控制器多采用定點表示”,可以猜測這個“使用者”應該指的是各中程式語言的編譯器咯!


正文整形數int、浮點型資料float,在記憶體中儲存形式表示方法
*****float型在記憶體中佔4個位元組,即32位,同樣int或long型也佔4個位元組,在對各自的32位進行逐位分解後發現,它們所代表的具體意義卻相差甚遠。


*****首先分解整形的32位,對於無符號整形(unsigned int) ,分解如下:至右向左把第i位的值記為bi(0或1),則這一位代表的十進位制數值為:bi * 2^i, i=0,2,...31。整形的4個位元組(32位)二進位制數折算成十進位制數為:b31 * 2^31 + ... + bi * 2^i + ... + b1 * 2 + b0 * 1 ——記為“公式@”。


*****對於有符號整形(signed int),最高位(第31位)代表符號,0正1負,剩餘的31位必須減1再各位取反,記為“操作#”,然後按以上“公式@”得出這個整形數的絕對值。


*****以上作為一個引子,以下float分解也必須建立在此基礎上,記住“操作#”和“公式@”兩個約定的含義。同時糾正一下提問者的說法“能表達的範圍應該也就0-2^32”,整型準確的數值範圍為:有符號( (-2^31) —— (2^31-1)),無符號( 0 —— (2^32-1) )。下面引導到關鍵問題上,float的32位在記憶體中到底分別代表什麼意義?
    
*****把所有32位用b31-b0(從高到低)表示,b31同樣是符號位,其意義為0正1負。b30-b23總共8位是一個有符號整形(signed int),先後用“操作#”和“公式@”計算得到一個數值E (十進位制範圍是-128 —— 127),再由它經過指數運算得到2^E,十進位制範圍是:1.0 * 10^(-38) —— 1.7 * 10^38 。餘下的23位b22-b0代表小數值,其中b22代表的十進位制數值為:b22 * 2^(-1)即b22 * 0.5, b21代表的十進位制數值為:b22 * 2^(-2)即b22 * 0.25,以此類推,所以小數範圍為0 —— 1(實際為0.0000…1 至 0.9999…) 。


*****從以上分解可知,float的32位都有了各自的意義,可以分為3塊,符號塊S (b31),指數塊E (b30-b23),小數塊D(b22-b0),但如何組裝成一個實際的小樹呢?具體演算法就是:
(-1)^S * (1.0 + D) * 2^E ,最終數值範圍是-3.4*10^-38 —— 3.4*10^38。


*****最後提醒一下,所有浮點數在進出記憶體時都經過相應的硬體進行以上“操作#”和“公式@”。程式設計人員無需深究其中細節,如若是出於好奇心,那是值得理解並支援地。