程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 移碼及浮點數在內存中的存儲方式,浮點數

移碼及浮點數在內存中的存儲方式,浮點數

編輯:關於C語言

移碼及浮點數在內存中的存儲方式,浮點數


首先說一下十進制的小數怎麼轉化為二進制的小數,計算機根本就不認識10進制的數據,他只認識0和1,所以,10進制的小數在計算機中是用二進制的小數表示的。

十進制的小數轉化為二進制的小數的方法:

可以簡單的概括為正序取整,將十進制的小數部分乘以2,然後取整數部分。

例如將0.2轉化為二進制的小數,那麼0.2*2=0.4,其整數部分是0,所以二進制小數的第一位為0,然後0.4*2=0.8,其整數部分是0,所以二進制小數的第二位為0,然後0.8*2=1.6,其整數部分是1,所以二進制小數的第三位是1,然後0.6*2=1.2,其整數部分是1,所以二進制小數的第四位是1。就這樣一直計算下去,

再例如8.25用二進制怎麼表示:首先8用二進制表示是1000,然後0.25*2=0.5,其整數部分是0,所以二進制小數的第一位是0.然後0.5*2=1.0,所以二進制小數的第二位是1,所以8.25用二進制表示就是1000.01.

移碼:已知一個10進制數,怎麼求它所對應的移碼,補碼的符號位取反就是移碼,或者是加上128(假設是8),     

例如,要求1的移碼,1+128=129,,129=1000 0001或者用先求補碼然後符號位取反的方法,那麼先求出1的補碼,1的補碼是0000 0001,然後把他的符號位取反得到1000 0001,可以看到,兩種方法求得的結果是一樣的,

再比如求-1的移碼,-1+128=127=0111 1111,或者可以先求出-1的補碼,-1的補碼是1111 1111,那麼把符號位取反得到移碼0111 1111,兩種方法得到的結果是一樣的。

另外,這裡求解移碼的方法和下面浮點數存儲的時候求移碼(階碼)的方法是不一樣的,百度輸入移碼,上面一般會說,移碼一般用作浮點數的階碼,但是這裡說的移碼的求法是原始數據加上128或者補碼的符號位取反,而下面求浮點數階碼的時候是原始數據加上127

另外,為什麼要用移碼表示階碼,而不用補碼表示階碼,采用這種方式表示的目的是簡化比較。因為,指數必須是有符號數才能表達很大或很小的數值,如果采用補碼表示的話,首先小數是有符號的,如果指數也是有符號的,那麼就不能簡單的對浮點數進行大小比較。因為根據補碼比較大小的話,要先轉換成原碼再比較大小,正因為如此,指數部分使用所謂的偏正值形式表示,實際值為原始值與一個固定值(32位的情況是127)的和。將它的值調整到一個無符號數的范圍內以便進行比較。因為移碼沒有符號位,所以我們直接可以由移碼的表示形式看出對應數值的大小,由此可見,移碼是沒有符號位的,移碼的最高位不能看做是符號位而應看做是數值位,例如上面的1000 0001把最高位看成數值位才得到129。

C語言浮點數存儲方式

浮點數(單精度float和雙精度的double)在內存中是以二進制的科學計數法表示的, ,主要由三部分構成:符號位+階碼+尾數。float存儲時使用4個字節,double存儲時使用8個字節。各部分占用位寬如下所示:

             符號位     階碼      尾數     長度

float              1         8         23      32

double          1         11        52      64

符號位:0表示整數,1表示負數,注意這裡的符號位是尾數的符號不是指數部分的符號,注意,所有的浮點數都是有符號數,不能定義unsigned float,這樣定義的話,編譯器會報錯,當然有的編譯器只是警告而不報錯,

階碼(指數部分):用於存儲科學計數法中的指數數據,並且采用移位存儲,

尾數部分:尾數部分下面會詳細說明,

其中float的存儲方式如下圖所示:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved