CPU中的二進制數據(小數篇)

1.用二進制數表示小數

主要是小數部分乘以2,取整數部分依次從左往右放在小數點後,直至小數點後爲0正則表達式

2.什麼是浮點數

浮點數是指用符號,尾數,基數和指數這四部分來表示的小數。由於計算機內部使用的是二進制數,因此基數天然是2。所以,實際的數據中每每不考慮基數,只用符號,尾數,指數這三部分便可表示浮點數。spa

也就是說,64位(雙精度浮點數)和32位(單精度浮點數)的數據,會被分爲三部分來使用。code

符號部分:是指使用一個數據位來表示數值的符號。和用二進制數來表示整數時的符號位時相同的blog

尾數部分:用的是「將小數點前面的值固定爲1的正則表達式」(按照特定的規則來表達數據的形式即爲正則表達式)get

指數部分:用的則是「EXCESS系統表現」io

3.正則表達式和EXCESS系統

尾數部分:

正則表達式:在二進制中,咱們使用的是「將小數點前面的值固定爲1的正則表達式」。具體來說,就是將二進制數表示的小數左移或右移(這裏是邏輯位移)數次後,整數部分的第1位變爲1,第2位以後都變成0(這樣是爲了消除第2位以上的數位)。並且,第1位的1實際的數據中不保存。因爲第1位必須是1,所以,省略該部分後就節省了一個數據位,從而也就能夠表示更多的數據範圍(雖不算太多)table

單精度浮點數的正則表達式的具體例子以下:class

1011.0011 原始數值
0001.0110011 右移使整數部分的第1位變成1

0001.01100110000000000000000變量

確保小數點之後的長度爲23
01100110000000000000000 僅保留小數點後面的部分

指數部分:

EXCESS系統表現:經過將指數部分表示範圍的中間值設爲0,使得負數不須要用符號來表示,當指數部分是8位單精度浮點數時,最大值11111111 = 255的1/2,即011111111 = 127(小數部分捨棄)表示的是0,指數部分是11位雙精度浮點數時,1111111111 = 2047的1/2,即011111111111 = 1023(小數部分捨棄)表示的是0。二進制

單精度浮點數指數部分的EXCESS系統表現

實際的值(二進制數) 實際的值(十進制數) EXCESS系統表現(十進制數)
11111111 255 128 =(255-127)
11111110 254 127 =(254-127)
…… …… ……
01111111 127 0 =(127-127)
01111110 126 -1 =(126-127)
…… …… ……
00000001 1 -126 =(1-127)
00000000 0 -127 =(0-127)

在實際的程序中進行確認:

 1 #include <stdio.h>
 2 
 3 void main(void){
 4     float data;
 5     unsigned long buff;
 6     int i;
 7     char s[34];
 8 
 9     //將0.75以單精度浮點數的形式存儲在變量data中
10     data = (float)0.75;
11 
12     //把數據複製到4字節長度的整數變量buff中以逐個提取出每一位。
13     memcpy(&buff,&data,4);
14 
15     printf("%ld\n",buff);
16 
17 
18     //逐個提取出每一位
19     for (i = 33; i >= 0; i--){
20         if(i == 1|| i == 10){
21             //加入破折號來區分符號部分,指數部分和尾數部分。
22             s[i] = '-';
23         }else{
24             //爲各個字節賦值‘0’或者‘1’
25             if(buff % 2 == 1){
26                 s[i] = '1';
27             }else{
28                 s[i] = '0';
29             }
30             buff /= 2;
31         }
32     }
33     s[34] = '\0';
34 
35     //顯示結果
36     printf("%s\n",s);
37 
38     getchar();
39 
40 }

輸出結果:

1061158912
0-01111110-10000000000000000000000

該程序執行後,十進制數0.75用單精度浮點數來表示就變成了0-01111110-1000000000000000000000表示的就是(+1.5*2的-1次冪)。

相關文章
相關標籤/搜索