href="./Fillchar%20过程全解.files/filelist.xml" rel="File-List" />

Fillchar 过程全解

Fillchar过程全解

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来填充,由于各种数据类型对相同的二进制码具有不同的解释,故最后得到的结果也大相径庭。本文探讨了各种类型数据的内部存储机制,有助于加深对数据类型的理解。

Fillchar过程全解相关推荐

  1. Numpy编写BP传播过程全解

    ©PaperWeekly 原创 · 作者|孙裕道 学校|北京邮电大学博士生 研究方向|GAN图像生成.情绪对抗样本生成 引言 BP反向传播矩阵推导图示详解一文中在矩阵视角下对 BP 的原理进行了详细的 ...

  2. 破解WEP密钥过程全解 (下)

    三.实战破解过程 1.用Kismet进行网络探测 Kismet是一个基于Linux的无线网络扫描程序,这是一个相当方便的工具,通过测量周围的无线信号来找到目标WLAN.虽说Kismet也可以捕获网络上 ...

  3. Cisco_IP_Communicator_软电话配置过程全解

    近来,小生在网上看到 很多关于Cisco_IP_Communicator_软电话的问题 ,很多网友也有疑问,今天我给大家演示一下如何使用软电话的. 使用环境:公司内部 所需软件:Cisco_IP_Co ...

  4. MDK 的编译过程及文件类型全解

    出处:MDK 的编译过程及文件类型全解 MDK 的编译过程及文件类型全解 ------(在arm9的开发中,这些东西都是我们自己搞定的,但是在windows上,IDE帮我们做好了,了解这些对深入开发是 ...

  5. 简述mysql完全备份过程_【SQL】MySQL之使用mysqldump全备份及恢复过程详解_MySQL

    mysqldump bitsCN.com [SQL]MySQL之使用mysqldump全备份及恢复过程详解 [目标]使用mysqldump做全备,结合mysql自带的binlog功能实现增量备份 为了 ...

  6. MDK的编译过程及文件类型全解——(二)

    前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. 本文转载自:第48章 MDK的编译过程及文件类型全解-零死角玩转STM32 ...

  7. 嘉立创电路板制作过程全流程详解(二):沉铜、线路

    上一篇文章,我们了解了第1道和第2道工序,MI和钻孔,这篇文章,我们将了解第3道工序和第4道工序:沉铜和线路. 看上一篇文章,点击这里: 嘉立创电路板制作过程全流程详解(一):MI.钻孔 第3道工序: ...

  8. 嘉立创电路板制作过程全流程详解(五):测试、锣边、V-CUT、QC、发货

    第1篇文章,点击这里:嘉立创电路板制作过程全流程详解(一):MI.钻孔 第2篇文章,点击这里:嘉立创电路板制作过程全流程详解二:沉铜.线路 第3篇文章,点击这里:嘉立创电路板制作过程全流程详解三:图电 ...

  9. 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列

    第48章     MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

最新文章

  1. Unable to execute dex: Multiple dex files define异常的解决办法
  2. 20211209 为什么Barbalat引理推论中必须有导数一致有界,才能得到导数趋于0
  3. RepositionBars的用法和参数分析
  4. boost::interprocess::windows_shared_memory用法的测试程序
  5. 富学金融穷学IT,分析互联网的新财富密码
  6. 【Boost】boost库中智能指针——weak_ptr
  7. 前端面试题目汇总摘录(JS 基础篇)
  8. cmd编译可以通过执行没有结果_Go语言是如何完成编译的
  9. 必填校验加变色,点击颜色消失
  10. “出道” 5 年采用率达 78%,Kubernetes 的成功秘诀是什么?
  11. php1045无法登录mysql_phpstudy安装完成后打开phpmyadmin提示#1045 无法登录 MySQL 服务器...
  12. Android 透明动画实现 详细概述
  13. 【PostgreSQL-9.6.3】函数(1)--数值型函数
  14. Android 自定义View(三)
  15. 在php中使用Memcache
  16. 基于Servlet面试题进行JavaWeb入门学习
  17. 国内外cms网站大全
  18. Mysql监控工具介绍-Monyog
  19. 抗疫先锋 | 滴滴云携手你我,一起战“疫”,共克时艰
  20. 基于MATLAB完成卷积运算,基于Matlab的离散卷积

热门文章

  1. 电脑打印提示打印机脱机解决办法
  2. 谁用foobar?我这里有几个非常酷的Title Formatting!原创
  3. 2013年计算机等级考试修改方案
  4. 【UEFI实战】网络启动
  5. 【UEFI实战】Secure Boot
  6. 梦幻诛仙linux纯端架设教程,【梦幻诛仙】【双端手游】【最完美,最全的,视频架设教程】...
  7. axios 配置loading_vue axios配置 发起请求加载loading请求结束关闭loading
  8. rectangle c语言,C语言,rectangle() ZeroMemory()这两个函数不太理解 求高人指点一下简单用法 及格式......
  9. day42-多线程与多进程
  10. 025:求特殊自然数