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/lonsine/p/3289966.html

Delphi 里 FillChar的用法相关推荐

  1. delphi FillChar的用法(转)

    delphi FillChar的用法(转) (2012-12-24 15:12:06) 转载▼ 标签: it 分类: delphi7 FillChar的用法(delphi) Fillchar是Turb ...

  2. 500分求助,delphi里用standred来配置dbf文件

    500分求助,delphi里用standred来配置dbf文件 Delphi / Windows SDK/API http://www.delphi2007.net/DelphiDB/html/del ...

  3. delphi TStrings的一些用法

    Delphi TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText ...

  4. [转载] python里字典的用法_python中字典(Dictionary)用法实例详解

    参考链接: Python字典dictionary copy方法 本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映 ...

  5. delphi 中 delete的用法

    delete 是删除一个 字符串中的 某部分字符 用法是 delete(str,//被删除的字符串                index,//从第几个字符开始删除               co ...

  6. response里的setHeader用法

                                                          response.setHeader()的用法 1. HTTP消息头 (1)通用信息头 即能 ...

  7. 关于Python里的super用法研究

    转自:http://blog.csdn.net/johnsonguo/article/details/585193 虽然我现在没看懂,不过先转一个,以后有时间了再看. 一.问题的发现与提出 在Pyth ...

  8. delphi里用java_如何在整个Delphi应用程序中使用ID

    一种方法是将DataModule添加到项目中,并使 UserID 为其中的一个字段 . 所以,使用Delphi的默认命名,你会有 type TDataModule1 = class(TDataModu ...

  9. Angular路由里的canActivate用法

    看个具体的例子. const CUSTOM_ROUTES: Routes = [{ path: "custom/:id", component: RouteDemoComponen ...

最新文章

  1. 轻松实现QQ用户接入
  2. PHP环境搭建:Windows 7下安装配置PHP+Apache+Mysql环境教程(转)
  3. P1319 压缩技术(python3实现)
  4. Eclipse Memory Analyzer(MAT) 使用总结
  5. Go语言基础(四)—String与其他基本数据类型的转换
  6. 第一章python绝对温标身体质量指数bmi
  7. 进程与线程的区别?--多线程与线程池
  8. python朴素贝叶斯分类器_简单说一下朴素贝叶斯分类器
  9. 现代软件工程 第十五章 【稳定和发布阶段】练习与讨论
  10. oracle中的ROLLUP函数
  11. 【波束形成】MMSE波束形成,自适应MMSE波束形成以及自适应MBER波束形成
  12. MySQL事务中幻读实践
  13. 内核源码包打包成rpm方式
  14. 资深运维也不知道的那些事
  15. 资源-1.中国2000个城市名和对应的拼音
  16. 使用webgl(three.js)搭建3D智慧园区、3D大屏,3D楼宇,智慧灯杆三维展示,3D灯杆,web版3D,bim管理系统——第六课...
  17. 白杨SEO:谈谈如何让微信公众号排版设计好看又实用?
  18. 支付宝福字出五福敬业爱国富强和谐友善福图片收集收藏攻略
  19. Android 常用RGB值及名称
  20. 强网杯2018逆向 hide lebel:linux脱壳 / create function / mmap / XTEA变形 / 大小端

热门文章

  1. Duan2baka的各种LCA模板!
  2. 开发框架:IOE 架构
  3. Jmeter下的bugfree的登录、新建bug、解决bug
  4. 最失败的项目管理 zz
  5. 安卓DownloadManager下载视频并用VideoView播放
  6. zsh: command not found 解决方法
  7. [USACO08FEB]Making the Grade G 和 CF714E
  8. [故障分析]出现大量僵尸进程(zombie)
  9. 【RAC】Oracle 11gR2 RAC 中的 Grid Plug and Play(GPnP) 是什么?
  10. keil c语言编译运行,Keil的c语言编译器