資料在記憶體中的儲存形式

2021-09-27 11:38:50 字數 3532 閱讀 2631

資料的基本型別

一 整形資料

char

字元資料型別,在記憶體中佔乙個位元組

short

短整型,在記憶體中佔兩個位元組

int整形,在16位的平台中佔兩個位元組,在32位平台中佔四個位元組

long

長整型,在32位平台中佔四個位元組,在64位平台中佔八個位元組

long long

更長的整型,佔八個位元組

float

單精度浮點型,佔四個位元組

double

雙精度浮點型,佔八個位元組

乙個變數的建立是需要在記憶體中開闢空間的,而空間的大小是根據不同的型別來決定的。資料在這些空間中以二進位制補碼的形式儲存,而計算機中有符號數有原碼,反碼,補碼三種表示形式,並且還有符號位和數值位,符號位用0表示正數,1表示負數

數值位正數和負數的表示方式則不同。

//表示數字20

原碼: 0000 0000 0000 0000 0000 0000 0001 0100

16進製制:0x 0 0 0 0 0 0 1 4

0x00 00 00 14

//表示數字-10

原碼: 0000 0000 0000 0000 0000 0000 0000 1010

反碼: 1111 1111 1111 1111 1111 1111 1111 0101

補碼: 1111 1111 1111 1111 1111 1111 1111 0110

16進製制:0x f f f f f f f 6

0xff ff ff f6

-10在記憶體中儲存的二進位制數就是1111 1111 1111 1111 1111 1111 1111 0110

如果乙個數是正數,那麼在記憶體中,他的原碼,反碼和補碼是一樣的,但是如果這個數是負數,他會以補碼的形式進行儲存。

int main()

在這組資料中,會發現資料的儲存順序是倒著的。

這是因為大端和小端這兩種儲存模式

判斷計算機是大端還是小端:

union uu//聯合結構體

;//特點:i和a共用一塊記憶體

對二進位制的新理解

#include#includeint main()

return 0;

}

#includeint main()

return 0;

}

經過執行可以看到,兩個程式都陷入了死迴圈,這是因為二進位制資料存放的原因,它們可以近似的看成乙個環形,以有符號數來說,char型別的範圍為-128 ~ 127,就形成了從0-127- -128- -1 -0這樣的乙個環,所以,i永遠不會等於128,就會造成死迴圈,類似於鐘錶的乙個結構

127   0111 1111 

1 0000 0001

127+1 1000 0000 (-128的原碼)

反碼 1111 1111

補碼 1 0000 0000

-1 原碼 1000 0001

反碼 1111 1110

補碼 1111 1111

1 原碼 0000 0001

-1+1 1 0000 0000 (0的原碼)

資料的整形截斷和整形提公升問題

不同的資料型別所表示的資料儲存範圍都有差異,當給乙個變數輸入乙個超出改型別最大儲存範圍的數時,再對這個變數進行列印,結果則會出現差異,就像下面這兩個例子一樣:

int main()

int main()

-128 在記憶體中的儲存是 

10000000 00000000 00000000 10000000-->這是他的原碼

11111111 11111111 11111111 01111111-->這是他的反碼

11111111 11111111 11111111 10000000-->這是他的補碼

char 型別只佔乙個子節大小,所以在給a初始化賦值後,就只能把-128後8位賦值給a,因為電腦是小端,低位址存放低資料,所以a的補碼是 1000 0000  ,這裡就發生了整形的截斷,下面列印a 的時候,%u 是以32位無符號數列印,就會在a的高位上補1(關於補位,如果是無符號數,就補0;如果是有符號數,就補他的符號位的數字),所以最終列印的

a

11111111 11111111 11111111 10000000 --->4294967168

這就發生了整形的提公升。

二  浮點型在記憶體中的儲存

int main()

出現這種情況是因為,國際標準ieee(電氣和電子工程)754,規定任意乙個浮點數v可以寫成下面的形式         

(-1)^s*m*2^e

(-1)^s表示符號位,當s=0時,v為正數;當s=1時,v為負數。

m表示有效數字,大於等於1,小於2。

2^e表示指數字。

規定:對於32位的浮點數,最高一位是符號位s,下來是8位指數e,最後是23位有效數字m(注意:因為有效數字本身就是小數字的,所以在出現位數不夠的情況下,應該在後面補零      相當於0.11100000000,如果在前面補零,就會成為0.0000011111,使得原來的數變小)

十進位制:5.0

二進位制:101.0 相當於1.01*2^2

(-1)^s*m*2^e

s=0 m=1.01 e=2

而在實際中,對於指數e位,如果e是八位,它的取值範圍是0~255,如果e是11位,它的取值範圍是0~2047,為了防止在計數過程**現負數的情況,ieee 754規定:存入記憶體時,e的真實值必須加乙個中間數,對於8位的e,中間數是127,對於11位的e,中間數是1023.    

2^10

e=10

儲存成32位浮點數的時候,儲存的資料是 10+127=137 -->1000 1001

e全為0 ----> 表示無限接近於0 浮點數裡沒有絕對的0

e全為1 ----> 表示正負無窮大

float資料在記憶體中的儲存形式

float型別數字在計算機中用4個位元組儲存。遵循ieee 754格式標準 乙個浮點數有2部分組成 底數m和指數e 底數部分 使用二進位制數來表示此浮點數的實際值 指數部分 占用8bit的二進位制數,可表示數值範圍為0 255 但是指數可正可負,所以,ieee規定,此處算出的次方必須減去127才是真...

float型資料在記憶體中的儲存形式

乙個float型實數在記憶體中佔4個位元組,即32個二進位制bit,從低位到高位依次叫第0位到第31位。這32位可以分為3個部分 符號位 第 31位 階碼 第 30位到第 23位共 8位 尾數 最低 23位 1 符號位。最高位也就是第31位表示這個實數是正數還是負數,為0表示正數或0,為1表示負數....

float型在記憶體中的儲存形式

單精度float型在記憶體中佔32bits即4個位元組。那麼它在記憶體中的儲存形式是什麼呢?它的組成如上圖 分為符號位 0正,1負 指數字,尾數字。接下來看幾個例子 1 浮點型1.5在記憶體中的二進位制形式是 0011 1111 1100 0000 0000 0000 0000 0000 0 符號位...