信息學聯賽輔導:Fillchar過程全解(3)
2009-11-12 22:10:14網絡
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
longint類型的數據是用補碼表示的有符號數,最高位是符號位,0表示正,1表示負,由于本數是正數,故補碼、反碼及原碼均為00000001000000010000000100000001,其值為(224+216+28+1)10=( 16843009)10;
如果,執行的是fillchar(a,size(a),255),結果又是怎樣的?
由于(255)10=(11111111)2,故填充后,補碼為11111111111111111111111111111111,它是負數,則其反碼為11111111111111111111111111111110,原碼為10000000000000000000000000000001,其值為-1
6.single 每個元素是4字節量,全部為2.36942782761724E-0038,這是因為,對于每個元素來講,用1填充后的結果與longint類型的二進制碼完全相同,但是, single類型對此數據的“解釋”卻完全不同:
A.最高位(第31位)是整個數的符號位,0為正, 1為負;
B.接著的8位(第30位至第23位)是用移碼表示的階碼;
C.后面的23位(第22至第0位)表示尾數;
D.單精度量的值為:±2實際指數*實際尾數
①、若階碼=00000000,則實際指數=-126,實際尾數=(0.???????????????????????)2,其中的?代表相應位置上的二進制碼(0或1);顯然,在?全為0時, 這個單精度量的值為0;
②、若階碼大于00000000且小于11111111,則實際指數=階碼-(127)10=階碼-01111111,實際尾數=(1.???????????????????????)2
③、INF(無窮大)若階碼=11111111,尾數全0,則已達上界,被作為無窮大
④、浮點運算錯誤:若階碼=11111111,尾數在(00000000000000000000000, 10000000000000000000000)之間。
⑤、NAN(非數:Not A Number)若階碼=11111111,尾數在[10000000000000000000000, 11111111111111111111111]之間
下面,我們來分析二進制碼為00000001000000010000000100000001的單精度數(single類型)的值是多少。①最高位為0,表示正數;②階碼為00000010,換成10進制數為2,則實際指數=2-127=-125,③尾數為00000010000000100000001,實際尾數=1. 00000010000000100000001, 換成10進制數為1+2-7+2-15+2-23=1.00784313678741455078125, ④此單精度數的值是+2-125*1.00784313678741455078125≈2.36942782761724e-38