準備知識:
- 計算機中存儲的數據類型採用的是補碼
- 正數的補碼與原碼相同,負數的補碼 = 反碼 + 1
- 反碼:符號位不動,各位上的值按位取反
- 符號位:1表示負數,0表示整數
(一)以windows32位系統爲例子,各類型數據佔用的內存大小:
(二)類型儲存
1:bool
bool 返回的是代表真假的true、false值,在內存中用一個字節(8個位)來表示,沒有什麼特殊之處;
2:char
char 是字符型,在內存中佔用一個字節(8個位),每個位置可以是0,也可以是1。如下圖所示:
每個位置都存在0或1兩種狀態,一共8個位置,就會存在2^8=256個狀態,所以char行就可以表示256個不同的值,只是當有符號和無符號時,表示的範圍不相同。
字符型在內存中都是存儲相對應的ASKLL碼值,比如字符‘A’,它的ASKLL碼值爲65,那麼在內存中的8個位應該表示爲如下圖所示:
3:short、int、long
這三種類型表示整數,每種類型在內存中的長度分別爲2、4、4字節,即16位、32位、32位。當然有符號和無符號所表示的數字範圍也是不相同的。
4:float、double
float類型的數據在內存中佔四個字節(32bit),(從右往左數)即低地址到高位地址依次叫第0位和第31位,着32位可以分爲3個部分:符號位(低31位)、階碼(功8位,從30位到23位)、尾數(剩下的低位23個位)。
其中:符號位 -> 0表示整數,1表示負數
階碼 -> 表示該實數轉換爲規格化的二進制實數後的指數與127(127在這裏爲偏移量)之和,規格化的二進制實數只能在 -127~ +127 之間。
尾數 -> 表示該實數轉換爲規格化的二進制實數後小數點以後的剩餘位。
double類型與float類型的存儲方式相同,只是各部分佔用的位數不相同,如下圖所示:
例一:將十進制178.125表示成機器內的32個字節的二進制形式.
1:將128.125表示成二進制數:
(178.125)(十進制數)=(10110010.001)(二進制形式);
:2:將二進制形式的浮點實數轉化爲規格化的形式:
10110010.001=1.0110010001*2^7 (小數點向左移動7個二進制位可以得到)
:3:符號位:
該數爲正數,故第31位爲0,佔一個二進制位.
4:階碼:
指數爲7,故其階碼爲127+7=134=(10000110)(二進制),佔從第30到第23共8個二進制位.
:5:尾數:
爲小數點後的部分, 即0110010001.因爲尾數共23個二進制位,在後面補13個0,即01100100010000000000000
:6:178.125在內存中的實際表示方式爲:
0 10000110 01100100010000000000000
例二:將-0.15625表示成機器內的32個字節的形式.
1:將-0.15625表示成二進制形式:
(-0.15625)(十進制數)=(-0.00101)(二進制形式);
2:將二進制形式的浮點數轉化爲規格化的形式:
(小數點向右移動3個二進制位可以得到) -0.00101=-1.01*2^(-3)
3:符號位:
該數爲負數,故第31位爲1,佔一個二進制位;
4:階碼:
指數爲-3,故其階碼爲127+(-3)=124=01111100,佔從第30到第23共8個二進制位;
5:尾數:
小數點後的01,當然後面要補21個0;
6:0.15625在內存中的實際表示形式爲:
1 01111100 01000000000000000000000
注1:二進制小數轉換爲十進制小數
比如把二進制小數110.11轉化爲十進制小數,步驟如下:
注2:十進制小數轉換爲二進制小數
方法是這樣的:先分別把十進制小數的整數部分和小數部分轉化爲二進制,然後合併即可。當然整數部分很簡單,直接進行二進制轉化,而小數部分就不一樣了。
具體做法是:用2乘十進制小數,可以得到積,將積的整數部分取出,再用2乘餘下的小數部分,又得到一個積,再將積的整數部分取出,如此進行,直到積中的整數部分爲零,或者整數部分爲1,此時0或1爲二進制的最後一位,或者達到所要求的精度爲止。比如:
所以最終得到:
參考資料:https://blog.csdn.net/ACdreamers/article/details/19012279
https://blog.csdn.net/jingr1/article/details/82758226
https://www.xuebuyuan.com/3180554.html