标题：fillchar
赋值函数
Pascal语言的一个内存块赋值函数。
定义Procedure FillChar (Var X; Count : Longint; Value : Char or Byte);
意为：对一个Char类型的数组X进行Count次赋值，当Value为Char类型时，直接赋值；若Value为Byte类型时，将Value作为AscⅡ赋值给每个单元。
引申被引申为：对一个内存块，每8个二进制位赋值Value，赋值Count次，长度为：Count*8个二进制位。
FillChar是一种很常用的过程，大部分赋值都是用FillChar完成的，因为对内存的块赋值，比使用循环要快得多。
举例根据引申意，我们举个例子：
首先定义：
Var
a : array[1..10000] of arrtype;
fillchar(a,sizeof(a),0);
一般使用fillchar时还使用了函数sizeof()，其功能是返回变量所占的总字节数，如上例返回：
当arrtype为 
⒈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个字节） 
⒉integer(word) sizeof(a）的值为20 （每个元素占2个字节，10个元素共占20个字节） 
⒊byte (shortint) sizeof(a）的值为10 （每个元素占1个字节，10个元素共占10个字节） 
⒋longint sizeof(a）的值为40 （每个元素占4个字节，10个元素共占40个字节） 
⒌boolean sizeof(a）的值为10（每个元素占1个字节，10个元素共占10个字节） 
⒍char sizeof(a）的值为10 （每个元素占1个字节，10个元素共占10个字节）
全体赋值
我们一般是用fillchar对数组赋值，然后使用sizeof函数进行整体赋值
举例：
FillChar(a,sizeof(a),1）；当arrtype为 
⒈boolean 全部为true（1是非0值，表示true) 
⒉char 全部为#1 
⒊byte，shortint 每个元素是1字节量，全部为1 
⒋integer,word 每个元素是2字节量，全部为（257）10。
⒌longint 每个元素是4字节量，全部为（16843009）10。
⒍single 每个元素是4字节量，全部为2.36942782761724E-0038
integer和word全部为257是因为：
在一个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。
另：integer类型的数据是用补码表示的有符号数，最高位是符号位，0表示正，1表示负，
所以如果赋值导致最高位为1，就有可能变为负数。
byte，shortint类似
char是因为#1的ASCⅡ码为1，具体请参考ASCⅡ码表或词条ASCⅡ
longint 全部为16843009是因为
对于每个元素来讲，用1填充后变为： 
最高字节 次高字节 次低字节 最低字节
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
0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 1 |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；
single 全部为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
FillChar(a,sizeof(a),0);执行fillchar(a,sizeof(a),0); 
当arrtype为 
⒈real（其他实数类型差不多） 使得a中的元素全部成为0.0 
⒉integer(byte,word,longint,shortint都相同） 全部为0 
⒊boolean 全部为false 
⒋char 全部为#00
FillChar(a,sizeof(a),255）；执行fillchar(a,sizeof(a),255）； 
当arrtype为 
⒈real（其他实数类型差不多） 使得a中的元素全部成为-1.0
⒉integer(byte,word,longint,shortint都相同） 全部为-1 
⒊char 全部为#-1
附：关于集合类型对于集合类型 若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]相同。
部分赋值
前面讲的都是全部字节被填充（因为用了sizeof()函数） 
对上例，若执行fillchar(a,1,55），即将变量a的第一个字节（下标最小的元素的最低字节）填充为（55）10，其原理雷同。
小结
Fillchar(var X; Count: Word; value）过程的功能是，把指定变量X在内存段中所占的第Count个字节中的每个字节用一个字节的数据value来填充，由于各种数据类型对相同的二进制码具有不同的解释，故最后得到的结果也大相径庭。
以下是FillChar的过程原型：
procedure FillChar(var Dest; count: Integer; Value: Char);
var
I: Integer;
P: PChar;
begin
P := PChar(@Dest);
for I := count-1 downto 0 do
P[I] := Value;
end;