【建行来源码】【一键搭建棋牌游戏源码】【卡密社区源码破解版】delphi 补码 源码_补码程序代码

时间:2024-12-28 16:52:13 来源:keystone源码分析 uuid 分类:休闲

1.delphi fillchar 在哪个单元

delphi 补码 源码_补码程序代码

delphi 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..] 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)的值为(每个元素占6个字节,个元素共占个字节)

       ingle

       izeof(a)的值为(每个元素占4个字节,个元素共占个字节)

       double

       izeof(a)的值为(每个元素占8个字节,个元素共占个字节)

       extended

       izeof(a)的值为(每个元素占个字节,个元素共占个字节)

       com

       izeof(a)的值为(每个元素占8个字节,个元素共占个字节)

       2.integer(word) sizeof(a)的值为

       ï¼ˆæ¯ä¸ªå…ƒç´ å 2个字节,个元素共占个字节)

       3.byte (shortint) sizeof(a)的值为

       ï¼ˆæ¯ä¸ªå…ƒç´ å 1个字节,个元素共占个字节)

       4.longint sizeof(a)的值为 (每个元素占4个字节,个元素共占个字节)

       5.boolean sizeof(a)的值为(每个元素占1个字节,个元素共占个字节)

       6.char sizeof(a)的值为

       ï¼ˆæ¯ä¸ªå…ƒç´ å 1个字节,个元素共占个字节)

       æ‰€ä»¥ä¾‹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字节量,全部为()。这是因为

       åœ¨ä¸€ä¸ªinteger或word 型变量中,它的高、低两个字节均用1来填充(将进制数1转化为二进制数),结果为:

       é«˜å­—节 低字节

        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

       æ˜¾ç„¶ï¼Œå¾—到的量就是()=()2。

       å¦‚果,执行的是fillchar(a,size(a),),结果又是怎样的?

       å› ä¸º()=()2,所以,填充后为:

       é«˜å­—节 低字节

        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类型的量,其值为(-),这是因为integer类型的数据是用补码表示的有符号数,最高位是符号位,0表示

       æ­£ï¼Œ1表示负,由于本数是负数,补码为,则反码为,原码为

       ï¼Œå…¶å€¼ä¸º-(++++++1)=-();对于word类型的量,其值

       ä¸º(),这是因为word类型的数据是用原码表示的无符号数(非负数),原码为,其值为(+

       ++++++++1)=();

       5.longint

       æ¯ä¸ªå…ƒç´ æ˜¯4字节量,执行fillchar(a,size(a),1)后,全部为()。这是因为,对于每个元素来讲,用1填充后变为:

       æœ€é«˜å­—节 次高字节

        |

       0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 1

       æ¬¡ä½Žå­—节 最低字节

        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表示负,由于本数是正数,故补码、反码及原码均为

       ï¼Œå…¶å€¼ä¸º(+++1)=( );

       å¦‚果,执行的是fillchar(a,size(a),),结果又是怎样的?

       ç”±äºŽ()=()2,故填充后,补码为,它是负数,

       åˆ™å…¶åç ä¸º,原码为 ,其值为-1

       6.single

       æ¯ä¸ªå…ƒç´ æ˜¯4字节量,全部为2.E-,这是因为,对于每个元素来讲,用1填充后的结果与longint类型的二进制码完全相同,但是,

       ingle类型对此数据的“解释”却完全不同:

       A.最高位(第位)是整个数的符号位,0为正, 1为负

       B.接着的8位(第位至第位)是用移码表示的阶码

       C.后面的位(第至第0位)表示尾数

       D.单精度量的值为:±2实际指数*实际尾数

       â‘ ã€è‹¥é˜¶ç =,则实际指数=-,实际尾数=(0.?)2,其中的?代表相应位置上的二进制码(0或1);显然,在?全为0时,

       è¿™ä¸ªå•ç²¾åº¦é‡çš„值为0

       â‘¡ã€è‹¥é˜¶ç å¤§äºŽä¸”小于,则实际指数=阶码-()=阶码-,实际尾数=(1.?)2

       â‘¢ã€INF(无穷大)若阶码=,尾数全0,则已达上界,被作为无穷大

       â‘£ã€æµ®ç‚¹è¿ç®—错误:若阶码=,尾数在(,

       ï¼‰ä¹‹é—´ã€‚

       â‘¤ã€NAN(非数:Not A

       Number)若阶码=,尾数在[, ]之间

       ä¸‹é¢,我们来分析二进制码为的单精度数(single类型)的值是多少。①最

       é«˜ä½ä¸º0,表示正数;②阶码为,换成进制数为2,则实际指数=2-=-,③尾数为

       ï¼Œå®žé™…尾数=1. ,

       æ¢æˆè¿›åˆ¶æ•°ä¸º1+2-7+2-+2-=1.,

       â‘£æ­¤å•ç²¾åº¦æ•°çš„值是+2-*1.≈2.e-

       7.其他实数类型就不一一列举了。

       8.对于集合类型 若arrtype=set of '#'..'z'

       æ‰§è¡Œfillchar(a,sizeof(a),0)后的结果:a全为空集;sizeof(a)返回。为什么sizeof(a)的值为?原

       æ¥ï¼Œå¯¹é›†åˆç±»åž‹æ¥è®²ï¼Œç”±äºŽå…ƒç´ èŒƒå›´äº‹å…ˆå¿…须给定(如'#'..'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',用户给定的范围是:#..#,则扩大后的实际范围是#..#,元素个数为,需要用bit=byte表

       ç¤ºï¼Œæ•…数组a中每个元素(数组中的元素)占字节,共个元素要占字节。

       é—®é¢˜ï¼šå¯¹äºŽarrtype=set of '#'..'z'

       æ‰§è¡Œfillchar(a,sizeof(a),)后的结果是什么呢?()= ()2, 数组a中每个元素如a[1]占字节,即:

       ï¼Œ

       å…±ä¸ªäºŒè¿›åˆ¶ä½ï¼Œæœ€ä½Žä½ä¸º1,表示扩展后范围内的第1个集合元素(#即空格)属于集合a[1],第2位为1,表示第2个元素(#即“!”)属于

       é›†åˆa[1],第3位为1,表示第3个元素(#即“"”)属于集合a[1],第4位为0,表示第4个元素(#即“#”)不属于集合a[1],依此

       ç±»æŽ¨ã€‚其他的数组元素a[2],a[3],...,a[]都与a[1]相同。

       [例3]部分字节填充问题。前面讲的都是全部字节被填充(因为用了sizeof()函数)

       å¯¹ä¾‹1,若执行fillchar(a,1,),即将变量a的第一个字节(下标最小的元素的最低字节)填充为(),其原理雷同。

       [小结] Fillchar(var X; Count: Word

       value)过程的功能是,把指定变量X在内存段中所占的低Count个字节中的每个字节用一个字节的数据value来填充,由于各种数据类型对相同的二

       è¿›åˆ¶ç å…·æœ‰ä¸åŒçš„解释,故最后得到的结果也大相径庭。本文探讨了各种类型数据的内部存储机制,有助于加深对数据类型的理解。