計算機中的數,是用定點數和浮點數表示。
定點數:小數點位置固定的數,整數和純小數是用定點數來表示的,分別稱為定點整數和定點純小數。
浮點數:對於既有整數部分、又有小數部分的數,一般用浮點數表示,浮點數的小數點位置是不固定的,可以浮動。
如:234,4563,0.433 0.32134 等是定點數 而 454.32 234.5466等是浮點數。
對於定點型整數,小數點的位置默認在數值最低位的右邊。計算機能表示的定點整型數的大小范圍並不是任意的,它與計算機本身的字長有關,還與程序語言的實現環境有關。45.
對於定點純小數,小數點的位置固定在符號位與最高數值位之間。顯然,定點純小數所能表示數的范圍較小,並不能滿足實際問題的需要。定點純小數的精度與計算機本身的字長有關,與程序語言的實現環境有關。
※ 在大多數計算機中,存儲浮點數時,都會把浮點數轉換成兩個部分:整數部分和純小數部分。
整型數的二進制表示:對於整型數而言,又分為有符號和無符號的兩種,有符號的整型數既可以是正數,又可以是負數,正負號由字節的最高位來表示,0表示正數,1表示負數。
🎵有符號的二進制數
1.一個字節表示的數
如:1011 0100 其最高位的1為符號位,因此(1011 0100)的十進制數為:-(2^5+2^4+2^2) = -52。而0011 0100 的十進制數為:2^5+2^4+2^2=+52. 注:為了不浪費計算機的存儲空間,對於“正零”和“負零”有不同的處理,對於“正零”(0000 0000),表示數字0:而“負零”(1000 0000),表示-128。
2.兩個字節表示的數
如:1011 0100 1010 1101 其最高位的1為符號位,因此(1011 0100 1010 1101)的十進制數為:-(2^13+2^12+2^10+2^7+2^5+2^3+2^2+2^0)=-13485。而0011 0100 1010 1101 的十進制數為:(2^13+2^12+2^10+2^7+2^5+2^3+2^2+2^0)=+13485。
“正零”(0000 0000 0000 0000)表示數字0,“負零”(1000 0000 0000 0000)表示數字-32768。
🎵無符號的二進制整數
其最高位的0或1不再代表符號位,而代表具體的數值。
1.一個字節表示的數
如:1011 0100,它的十進制數為:2^7+2^5+2^4+2^2=180。
兩個字節同理,不再概述。
有符號的整型數和無符號的整型數的取值范圍:
以一個字節為例:
有符號:1000 0000 到 0000 0000 即從-128【1000 0000】到127【0111 1111】總計256個值 = 2^8。
無符號:0000 0000 到 1111 1111 即從0 到 255 總計256個值 = 2^8。
浮點型數據的二進制表示:---------------------------------重點-----------------------------------
浮點數在計算機中的表示可根據系統分配的字節數不同而分成單精度浮點數和雙精度浮點數,通常,計算機會分配4個字節給單精度浮點數,分配8個字節給雙精度浮點數。
計算機在存儲浮點數的時候,要將十進制浮點數轉化成二進制來表示,轉化的方法是先將浮點數轉化成整數部分和純小數部分,再將整數部分和純小數部分分別轉化成二進制。
整數部分采用除2取余,直到商為0為止,最先得到的余數為最低位,最后得到的余數為最高位。
十進制的(58)=二進制的(111010)
十進制的(0.625)=二進制的(0.101)
於是十進制58.625轉化為二進制111010.101
小數部分采用乘2取整,直到余下的小數為0或滿足精度要求為止,最先得到的整數為最高位,最后得到的整數為最低位。
計算機對存儲二進制表示的浮點數時,先要將其進行歸一化,也就是要將其表示成整型數和純小數的乘積形式。
上面這個十進制58.625=二進制111010.101=二進制1.11010101*2^5,即把小數點位向左移了5位。
目前c/c++語言都采用IEEE-754標准來表示浮點數的存儲格式,在IEEE-754標准中,單精度浮點數用4字節(32位)來存儲,雙精度浮點數用8字節(64位來存儲),分為三個部分:符號位、指數位和尾數。符號位表示數值的正負;指數位用於計算階碼,代表2的冪次;尾數為有效小數位數。
※ 單精度浮點數
浮點數的一般表達式如下:(-1)s x 2e x m
S | E | M |
其中S占1位,E占8位,M占23位。
e是實際的階碼值,代表浮點數的取值范圍;m是尾數,代表浮點數的精度。
S代表符號位,占1位。0代表正,1代表負。
E稱為“移碼”,代表指數位,占8位,E的取值范圍為0~255,實際取值為E=127+e (即e=E-127),因此,e的取值范圍為-127~+128。
M代表有效位數或稱為“小數”,它取自數位m的小數點后面的數,即m2=(1.m)2,在二進制數1.11010101中,m即為下划線所表示數字。
注:將浮點數歸一化后,小數點前面的1是不需要存儲的。
舉例:10進制數58.625 58.62510 = (1110 10.101)2 =25 x (1.1101 01 01 0000)2 【這里尾數精度為12位】
在此:符號位 S=0;階碼e=5,尾數m=(1.1101 01 01 0000)2 因此E=127+e=127+5=132=(1000 0100)2 M=(1.1101 01 01 0000)2
十進制數58.625在計算機中的存儲方式為:
32 | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
雙精度浮點數的符號位S占1位,移碼位占11位,尾數占52位,一共64位。存儲原理與單精度浮點數一致,只不
E = 1023+e
至於單精度浮點數e為什么要加127,雙精度浮點數e為什么要加1023,將在原反補移碼詳細概述。