|--浮點數怎么存儲在計算機中
浮點型變量是由符號位+階碼位+尾數位組成。
float型數據 二進制為32位,符號位1位,階碼8位,尾數23位
double型數據 二進制為64位,符號位1位,階碼11位,尾數52位
|--單精度32位存儲
1bit 8bit 23bit
|--雙精度64位存儲
1bit 11bit 52bit
浮點數二進制存儲形式,是符號位+階碼位+尾數位(針對有符號數)
浮點數沒有無符號數(c語言)
|--階碼:
這里階碼采用移碼表示,對於float型數據其規定偏置量為127,階碼有正有負,
對於8位二進制,則其表示范圍為-128-127,double型規定為1023,其表示范圍為-1024-1023
比如對於float型數據,若階碼的真實值為2,則加上127后為129,其階碼表示形式為10000010
|--尾數:
有效數字位,即部分二進制位(小數點后面的二進制位),
因為規定M的整數部分恆為1(有效數字位從左邊不是0的第一位算起),所以這個1就不進行存儲
|--具體步驟:
把浮點數先化為科學計數法表示形式,eg:1.1111011*2^6,然后取階碼(6)的值加上127(對於float)
計算出階碼,尾數是處小數點后的位數(1111011),如果不夠23位,則在后面補0至23位。
最后,符號位+階碼位+尾數位就是其內存中二進制的存儲形式
1 eg: 2 #include <stdio.h>
3 #include <stdlib.h>
4 int main(int argc, char *argv[])
5 { 6 int x = 12;
7 char *q = (char *)&x;
8 float a=125.5;
9 char *p=(char *)&a;
10
11 printf("%d\n", *q);
12
13 printf("%d\n",*p);
14 printf("%d\n",*(p+1));
15 printf("%d\n",*(p+2));
16 printf("%d\n",*(p+3));
17 return 0;
18 } 19
20 output: 21 12
22 0
23 0
24 -5
25 66
|--對於float型:
125.5二進制表示為1111101.1,由於規定尾數的整數部分恆為1,
則表示為1.1111011*2^6,階碼為6,加上127為133,則表示為10000101
而對於尾數將整數部分1去掉,為1111011,在其后面補0使其位數達到23位,
則為11110110000000000000000
內存中的表現形式為:
00000000 低地址
00000000
11111011
01000010 高地址
存儲形式為: 00 00 fb 42
依次打印為: 0 0 -5 66
解釋下-5,內存中是:11111011,因為是有符號變量所以符號位為1是負數,
所以其真值為符號位不變取反加一,變為:10000101化為十進制為-5.