zoukankan      html  css  js  c++  java
  • fillchar

    内存块赋值函数。

     

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

  • 相关阅读:
    ASP.NET Web API 控制器执行过程(一)
    ASP.NET Web API 控制器创建过程(二)
    ASP.NET Web API 控制器创建过程(一)
    ASP.NET Web API WebHost宿主环境中管道、路由
    ASP.NET Web API Selfhost宿主环境中管道、路由
    ASP.NET Web API 管道模型
    ASP.NET Web API 路由对象介绍
    ASP.NET Web API 开篇示例介绍
    ASP.NET MVC 视图(五)
    ASP.NET MVC 视图(四)
  • 原文地址:https://www.cnblogs.com/hackpig/p/1669193.html
Copyright © 2011-2022 走看看