王朝百科
分享
 
 
 

fillchar

王朝百科·作者佚名  2010-01-28  
宽屏版  字体: |||超大  

Pascal(一种类似C语言的编程语言)的一个内存块赋值函数。

定义:Procedure FillChar ( Var X; Count : Longint; Value : Char or Byte);

意为:对一个Char类型的数组X进行Count次赋值,当Value为Char类型时,直接赋值;若Value为Byte类型时,将Value作为AscII赋值给每个单元。

被引申为:对一个内存块,每8个二进制位赋值Value,赋值Count次,长度为:Count*8个二进制位。

FillChar是一种很常用的函数,大部分赋值都是用FillChar完成的,因为对内存的块赋值,比使用循环要快得多。

根据引申意,我们举个例子:

首先定义:

Var

a : array[1..10000] of arrtype;

fillchar(a,sizeof(a),0);

一般使用fillchar时还使用了函数sizeof(),其功能是返回变量所占的总字节数,如上例返回:

当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个字节)

全体赋值我们一般是用fillchar对数组赋值,然后使用sizeof函数进行整体赋值

举例:

FillChar(a,sizeof(a),1);

当arrtype为

1.boolean 全部为true(1是非0值,表示true)

2.char 全部为#1

3.byte,shortint 每个元素是1字节量,全部为1

4.integer,word 每个元素是2字节量,全部为(257)10。

5.longint 每个元素是4字节量,全部为(16843009)10。

6.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的ASCII码为1,具体请参考ASCII码表或词条ASCII

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为

1.real(其他实数类型差不多) 使得a中的元素全部成为0.0

2.integer(byte,word,longint,shortint都相同) 全部为0

3.boolean 全部为false

4.char 全部为#00

FillChar(a,sizeof(a),255);

执行fillchar(a,sizeof(a),0);

当arrtype为

1.real(其他实数类型差不多) 使得a中的元素全部成为-1.0

2.integer(byte,word,longint,shortint都相同) 全部为-1

3.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来填充,由于各种数据类型对相同的二进制码具有不同的解释,故最后得到的结果也大相径庭。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如何用java替换看不见的字符比如零宽空格​十六进制U+200B
 干货   2023-09-10
网页字号不能单数吗,网页字体大小为什么一般都是偶数
 干货   2023-09-06
java.lang.ArrayIndexOutOfBoundsException: 4096
 干货   2023-09-06
Noto Sans CJK SC字体下载地址
 干货   2023-08-30
window.navigator和navigator的区别是什么?
 干货   2023-08-23
js获取referer、useragent、浏览器语言
 干货   2023-08-23
oscache遇到404时会不会缓存?
 干货   2023-08-23
linux下用rm -rf *删除大量文件太慢怎么解决?
 干货   2023-08-08
刀郎新歌破世界纪录!
 娱乐   2023-08-01
js实现放大缩小页面
 干货   2023-07-31
生成式人工智能服务管理暂行办法
 百态   2023-07-31
英语学习:过去完成时The Past Perfect Tense举例说明
 干货   2023-07-31
Mysql常用sql命令语句整理
 干货   2023-07-30
科学家复活了46000年前的虫子
 探索   2023-07-29
英语学习:过去进行时The Past Continuous Tense举例说明
 干货   2023-07-28
meta name="applicable-device"告知页面适合哪种终端设备:PC端、移动端还是自适应
 干货   2023-07-28
只用css如何实现打字机特效?
 百态   2023-07-15
css怎么实现上下滚动
 干货   2023-06-28
canvas怎么画一个三角形?
 干货   2023-06-28
canvas怎么画一个椭圆形?
 干货   2023-06-28
canvas怎么画一个圆形?
 干货   2023-06-28
canvas怎么画一个正方形?
 干货   2023-06-28
中国河南省郑州市金水区蜘蛛爬虫ip大全
 干货   2023-06-22
javascript简易动态时间代码
 干货   2023-06-20
感谢员工的付出和激励的话怎么说?
 干货   2023-06-18
 
>>返回首页<<
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有