整型與浮點型資料在計算機記憶體中的儲存
1、型別的歸類
整型家族:char、unsigned char、signed char //對於char來說,標準裡並不預設其為有符號還是無符號的,這個結果取決於編譯器
short ( signed short [int] )、unsigned short [int]
int ( signed int )、unsigned int
long ( signed long [int] )、unsigned long [int]
浮點數家族:float
double
構造型別:陣列型別
結構體型別 struct
列舉型別 enum
聯合型別 union
指標型別
空型別
2、整型在記憶體中的儲存
1)整型在記憶體中以補碼的形式儲存。
原因有三:其一,使用補碼可以將符號位和數值域統一處理;其二,加法和減法可以統一處理(cpu只有加法器);其三,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。
2)資料儲存的大小端模式
小端位元組序儲存:資料的低位元組存到低地址處,高位元組存到高地址處。
大端位元組序儲存:資料的低位元組存到高地址處,高位元組存到低地址處。
存在不同位元組序儲存模式的原因:因為在計算機系統中是以位元組做單位的,每個地址單元對應一個位元組,一個位元組有8個位元位。不過在c語言中,除了具有一個位元組(8b)的char型別外,還有2個位元組(16b)的short型、4個位元組(32b)的int型等,而且對於位數大於8的處理器,由於暫存器寬度大於一個位元組,所以就必然存在如何安排多個位元組的問題。這就是小端儲存模式與大端儲存模式出現的原因。
例如對於一個short型別的x資料,在記憶體中的地址為0x0010,其值為0x1122,那麼0x11是x的高位元組,0x22是x的低位元組。對於大端儲存模式,0x11放在低地址的0x0010中,0x22放在高地址的0x0011中。對於小端儲存模式則相反。
3、浮點數在記憶體中的儲存
1)根據國際標準IEEE754,任意一個二進位制浮點數V可以表示為下面的形式:
(-1)^S*M*2^E
(-1)^S表示符號位,當S=0時,V為正數;當S=1時,V為負數
M表示有效數字,大於等於1,小於2
2^E表示指數位
2)對於32位的浮點數和64位浮點數的不同規定
對於32位的浮點數,最高1位是符號位S,接著是8位的指數E,剩下的23位是有效數字M。
對於64位的浮點數,最高1位是符號位S,接著的11位是指數E,剩下的52位是有效數字M。
3)幾點注意
第一,對於有效數字M,因為其值大於等於1而小於2,所以在計算機中,為了能夠利用23位(52位)表示更多的資料,IEEE754規定儲存M時預設這個數的第一位為1,所以只儲存後面的部分(小數點後的位)。然後等到讀取此數的時候,再把第一位的1加上去。
第二,對於指數E,為了能夠表示負數的指數,IEEE754規定,存入記憶體時E的真實值必須再加上一個中間數,對於8位的E,這個中間數為127;對於11位的E,這個中間數是1023。
第三,當E全為0時,讀取該數字時有效數字M不再加上第一位的1,因為這是一個無限接近與0的數字,表示正負0;當E全為1的時候,若M全為0,則表示一個正負無窮大的數。