delphi FillChar的用法(转)
生活随笔
收集整理的這篇文章主要介紹了
delphi FillChar的用法(转)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
delphi?FillChar的用法(轉)
(2012-12-24 15:12:06) 轉載▼標簽: it | 分類: delphi7 |
FillChar的用法(delphi)
Fillchar是Turbo/Borland Pascal的System單元的一個標準過程,它的使用格式是:FillChar(var X; Count: Word; value),它的功能是,把指定變量X在內存段中所占的低Count個字節賦為相同的值value, 其中value是填充的值,只能是Byte、Char或Boolean等單字節類型的值。在Free Pascal中稍加擴展為FillChar(var X; Count: Longint; value), 功能沒變。[例1]:Fillchar通常用來給數據賦初值。
var a:array [1..10] of arrtype;
執行fillchar(a,sizeof(a),0);
當arrtype為
1.real(其他實數類型差不多) 使得a中的元素全部成為0.0
2.integer(byte,word,longint,shortint都相同) 全部為0
3.boolean 全部為false
4.char 全部為#0
這里使用了函數sizeof(a),其功能是返回變量a所占的總字節數,如上例返回:
當arrtype為
1.real sizeof(a)的值為60(每個元素占6個字節,10個元素共占60個字節)
single sizeof(a)的值為40(每個元素占4個字節,10個元素共占40個字節)
double sizeof(a)的值為80(每個元素占8個字節,10個元素共占80個字節)
extended sizeof(a)的值為100(每個元素占10個字節,10個元素共占100個字節)
comp sizeof(a)的值為80(每個元素占8個字節,10個元素共占80個字節)
2.integer(word) sizeof(a)的值為20 (每個元素占2個字節,10個元素共占20個字節)
3.byte (shortint) sizeof(a)的值為10 (每個元素占1個字節,10個元素共占10個字節)
4.longint sizeof(a)的值為40 (每個元素占4個字節,10個元素共占40個字節)
5.boolean sizeof(a)的值為10(每個元素占1個字節,10個元素共占10個字節)
6.char sizeof(a)的值為10 (每個元素占1個字節,10個元素共占10個字節)
所以例1的結果就是將數組a的所有元素(全部字節)用0來填充,要注意對不同類型的數據而言,對“0”的“解釋”是截然不同的!對整型或實型量來 講,所有字節均為0,則該量也為0;對boolean型量(一個字節)來講,0表示false(非0數表示true),則該量為false;對char型 量(一個字節)來講,0表示ASCII碼值為0的字符,則該量為#0。
[例2]:將上例中的fillchar(a,sizeof(a),0)改為 fillchar(a,sizeof(a),1),結果如何呢?
執行fillchar(a,size(a),1);
當arrtype為
1.boolean 全部為true(1是非0值,表示true)
2.char 全部為#1
3.byte,shortint 每個元素是1字節量,全部為1
4.integer,word 每個元素是2字節量,全部為(257)10。這是因為
在一個integer或word 型變量中,它的高、低兩個字節均用1來填充(將10進制數1轉化為二進制數00000001),結果為:
高字節 低字節
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
顯然,得到的量就是(257)10=(0000000100000001)2。
如果,執行的是fillchar(a,size(a),171),結果又是怎樣的?
因為(171)10=(10101011)2,所以,填充后為:
高字節 低字節
15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
1 0 1 0 1 0 1 1 | 1 0 1 0 1 0 1 1
對于integer類型的量,其值為(-21589)10,這是因為integer類型的數據是用補碼表示的有符號數,最高位是符號位,0表示 正,1表示負,由于本數是負數,補碼為1010101110101011,則反碼為1010101110101010,原碼為 1101010001010101,其值為-(214+212+210+26+24+22+1)10=-(21589)10;對于word類型的量,其值 為(43947)10,這是因為word類型的數據是用原碼表示的無符號數(非負數),原碼為1010101110101011,其值為(215+213 +211+29+28+27+25+23+21+1)10=(43947)10;
5.longint 每個元素是4字節量,執行fillchar(a,size(a),1)后,全部為(16843009)10。這是因為,對于每個元素來講,用1填充后變為:
最高字節 次高字節
31 30 29 28 27 26 25 24 | 23 22 21 20 19 18 17 16
0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 1
次低字節 最低字節
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
7.其他實數類型就不一一列舉了。
8.對于集合類型 若arrtype=set of '#'..'z'; 執行fillchar(a,sizeof(a),0)后的結果:a全為空集;sizeof(a)返回120。為什么sizeof(a)的值為120?原 來,對集合類型來講,由于元素范圍事先必須給定(如'#'..'z'),每個元素是否存在于某集合中,只需用0或1記下即可,用0表示該元素不屬于某集 合,用1表示該元素屬于某集合,即只用1個二進制位就可表示1個元素是否屬于某集合,那么只要我們按元素的序號順序記下一串二進制代碼,就可以標記所有范 圍內的元素是否屬于某集合了。但這里有一個問題:數據的存儲通常是以字節為單位進行的,不是直接訪問每一個二進制位,因此,必須將用戶給定的元素的范圍進 行調整,調整原則是:兩端適當外擴,使第一個元素的序號以及元素的個數正好成為8的倍數,這樣就可以字節為單位存儲集合了。即:若arrtype=set of char1..char2(事先要定義char1,char2常量),則范圍擴大為newchar1..newchar2,其中newchar1=chr (ord(char1)-ord(char1) mod 8), newchar2=chr(ord(char2)+7-ord(char2) mod 8)。對于arrtype=set of '#'..'z',用戶給定的范圍是:#35..#122,則擴大后的實際范圍是#32..#127,元素個數為96,需要用96bit=12byte表 示,故數組a中每個元素(數組中的元素)占12字節,共10個元素要占120字節。
問題:對于arrtype=set of '#'..'z'; 執行fillchar(a,sizeof(a),135)后的結果是什么呢?(135)10= (10000111)2, 數組a中每個元素如a[1]占12字節,即: 100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111, 共96個二進制位,最低位為1,表示擴展后范圍內的第1個集合元素(#32即空格)屬于集合a[1],第2位為1,表示第2個元素(#33即“!”)屬于 集合a[1],第3位為1,表示第3個元素(#34即“"”)屬于集合a[1],第4位為0,表示第4個元素(#35即“#”)不屬于集合a[1],依此 類推。其他的數組元素a[2],a[3],...,a[10]都與a[1]相同。
[例3]部分字節填充問題。前面講的都是全部字節被填充(因為用了sizeof()函數) 對例1,若執行fillchar(a,1,55),即將變量a的第一個字節(下標最小的元素的最低字節)填充為(55)10,其原理雷同。
[小結] Fillchar(var X; Count: Word; value)過程的功能是,把指定變量X在內存段中所占的低Count個字節中的每個字節用一個字節的數據value來填充,由于各種數據類型對相同的二 進制碼具有不同的解釋,故最后得到的結果也大相徑庭。本文探討了各種類型數據的內部存儲機制,有助于加深對數據類型的理解。
轉載于:https://www.cnblogs.com/ziliudi/p/5355519.html
總結
以上是生活随笔為你收集整理的delphi FillChar的用法(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信号与系统——微分方程与差分方程——编辑
- 下一篇: C++ map嵌套使用 链接