【C語言】各類數據的存儲方式

準備知識:

  • 計算機中存儲的數據類型採用的是補碼
  • 正數的補碼與原碼相同,負數的補碼 = 反碼 + 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

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章