C語言之浮點數的記憶體表示

2021-07-31 13:05:16 字數 1021 閱讀 8211

c語言中基本資料型別有:整型(char  short  int)浮點型(float   duble)

這篇文章主要**浮點數在記憶體中的表示方法,剛學c語言時,一直都在想乙個問題,為啥int,float型別都是佔據4個位元組,在計算機內部都是二進位制來表示的,為啥兩者表示的範圍能夠不同?

主要參考資料《深入理解計算機系統》

c語言中,浮點資料型別在記憶體中的儲存分為:符號位、指數字、尾數三部分

如表: 型別

符號位指數字

尾數float

1(第31位)

8位(第23-30)

23double

1(第63位)

11位(52-62位)

52 可以看出,float,double這兩類資料型別在記憶體中的表示形式是一樣的。但是double型所占用的位元組數為8,而float型位元組數為4,可見double型變數的表示範圍(精度)更大(更高)

如何計算乙個float型別資料在記憶體中的具體二進位制表示呢?

first:將float資料轉換成二進位制數

second:採用科學計算法對二進位制數進行表示

third:計算指數偏移值,對於float型別指數偏移值為127,double型為1023

例項:計算浮點數6.5在計算機中的二進位制表示

6.5==》轉換為二進位制110.1===》科學計數1.101*(2^2)===》符號位0,指數字127+2=129==>10000001,尾數101

所以記憶體中6.5的表示為:0 10000001 10100000000000000000000-》0x40d00000

程式驗證:

float i=6.5;

unsigned int *p=(unsigned int*)&i;

printf("%f\n",i);

printf("0x%x\n",*p);

需要理解float和int在記憶體中的表示方法是不同的,由於float的表示方法較為複雜,所以運算速度較慢。且float的表示是一種近似表示,尤其在後續中如果用到float型別資料進行比較時,一定要注意。

C語言 浮點數在記憶體中的表示

單精度浮點數 1位符號位 8位階碼位 23位尾數 雙精度浮點數 1位符號位 8位階碼位 52位尾數 實數在記憶體中以規範化的浮點數存放,包括數符 階碼 尾數。數的精度取決於尾數的位數。比如32位機上float型為23位 double型為52位。單精度float型儲存在記憶體中的大小為4個位元組,即3...

浮點數的表示

在定點數表示中存在的乙個問題是,難以表示數值很大的資料和數值很小的資料。例如,電子的質量 9 10 28克 和太陽的質量 2 1033克 相差甚遠,在定點計算機中無法直接表示,因為小數點只能固定在某乙個位置上,從而限制了資料的表示範圍。為了表示更大範圍的資料,數學上通常採用科學計數法,把資料表示成乙...

浮點數的表示

日期 2010年6月 6日 1.前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶...