Delphi的类型换
点击次数:61 次 发布日期:2008-11-09 08:40:58 作者:源代码网
|
源代码网推荐 源代码网推荐 一、数的类型转换 源代码网推荐 源代码网推荐 源代码网推荐 把表达式的类型从一种类型转化为另一种类型,结果值是把原始值截断或扩展,符号位保持不变。例如: 源代码网推荐 源代码网推荐 数的类型转换 源代码网推荐 举例 源代码网推荐 源代码网推荐 字符转换为整数 源代码网推荐 Integer("A") 源代码网推荐 源代码网推荐 整数转换为字符 源代码网推荐 Char(48) 源代码网推荐 源代码网推荐 整数转换为1个字节的逻辑型 源代码网推荐 Boolean(0) 源代码网推荐 源代码网推荐 整数转换为2个字节的逻辑型 源代码网推荐 WordBool(0) 源代码网推荐 源代码网推荐 整数转换为4个字节的逻辑型 源代码网推荐 LongBool(0) 源代码网推荐 源代码网推荐 整数转换为10进制pascal型字符串 源代码网推荐 caption:=intToStr(15) 源代码网推荐 源代码网推荐 整数转换为16进制pascal型4位字符串 源代码网推荐 caption:=intToHex(15,4) 源代码网推荐 源代码网推荐 地址转换为长整型数 源代码网推荐 Longint(@Buffer) 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 二、数的“分开”与“合成” 源代码网推荐 源代码网推荐 取32位longint型数的高16位数为 源代码网推荐 hiword(longint-var) 源代码网推荐 源代码网推荐 低16位数为 源代码网推荐 loword(longint-var) 源代码网推荐 源代码网推荐 取16位数的 高8位数 源代码网推荐 hibyte(integer_var) 源代码网推荐 源代码网推荐 低8位数为 源代码网推荐 lobyte(integer_var) 源代码网推荐 源代码网推荐 取32位地址的段选择符和偏移量 段选择符(高16位地址)为 源代码网推荐 selectorof(p) 源代码网推荐 源代码网推荐 偏移量(低16位地址)为 源代码网推荐 offsetof(p) 源代码网推荐 源代码网推荐 段选择符和偏移量合成为指针 源代码网推荐 Ptr(SEG, OFS: Word)相当于C语言的宏MK-FP(SEG,OFS) 源代码网推荐 源代码网推荐 例如在Windows中,Task DataBase结构0FAh偏移处包含"TD"标识,我们可以容易地编写如下代码观察到这个位于Windows内部的未公开的秘密: 源代码网推荐 源代码网推荐 {函数ptr(seg,ofs)的用法,相当于C语言的MK-FP(seg,ofs)} 源代码网推荐 源代码网推荐 var p:pbyte;ch:char; 源代码网推荐 源代码网推荐 p:=ptr(getcurrentTask,$FA); 源代码网推荐 源代码网推荐 ch:=char(p^); {结果为ch="T"} 源代码网推荐 源代码网推荐 p:=ptr(getcurrentTask,$FA 1); 源代码网推荐 源代码网推荐 ch:=char(p^); {结果为ch="D"} 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 三、字符串string 字符数组与指向字 源代码网推荐 源代码网推荐 符串的指针pchar的区别与联系 源代码网推荐 源代码网推荐 这3者的基本概念相同,但有一些非常细微的差别,在编程时稍不注意就会出错,需高度重视。 源代码网推荐 源代码网推荐 1、使用指向字符串的指针,如果不是以0结尾,运行时就会出现错误。为了避免这种错误,需要在字符串结尾人工加入0 即char(0),或用strpcopy函数在字符串结尾自动加0。 源代码网推荐 源代码网推荐 例1: 指向字符串的指针,如果不是以0结尾,运行时会出现错误: 源代码网推荐 源代码网推荐 {s[0]=3 s[1]="n" s[2]="e" s[3]="w"} 源代码网推荐 源代码网推荐 var 源代码网推荐 s:string; 源代码网推荐 p:pchar; 源代码网推荐 begin 源代码网推荐 s:="new"; 源代码网推荐 label1.caption:=s; {new} 源代码网推荐 label2.caption:=intTostr(integer(s[0]));{3是字符串的长度} 源代码网推荐 源代码网推荐 p:=@s[1];{不是以0结尾,莫用pchar型指针} 源代码网推荐 label3.caption:=strpas(p); {运行时出现错误} 源代码网推荐 end; 源代码网推荐 源代码网推荐 源代码网推荐 例2:在字符串结尾人工加入0即char(0),可使用指向字符串的指针。 源代码网推荐 源代码网推荐 {s[0]=4 s[1]="n" s[2]="e" s[3]="w" s[4]=0;} 源代码网推荐 {p-->"new"} 源代码网推荐 var 源代码网推荐 s:string; 源代码网推荐 p:pchar; 源代码网推荐 begin 源代码网推荐 p:=@s[1]; 源代码网推荐 s:="new" char(0); {以0结尾,可用pchar型指针} 源代码网推荐 label1.caption:=strpas(p); {new} 源代码网推荐 label2.caption:=s; {new} 源代码网推荐 label3.caption:=intTostr(integer(s[0])); {4是字符串长度 end; 源代码网推荐 源代码网推荐 源代码网推荐 例3: 用strpcopy函数赋值会在字符串s结尾自动加0。 源代码网推荐 源代码网推荐 {s[0]=4 s[1]="n" s[2]="e" s[3]="w" s[4]=0;} 源代码网推荐 {p-->"new"} 源代码网推荐 var 源代码网推荐 s:string; 源代码网推荐 p:pchar; 源代码网推荐 begin 源代码网推荐 p:=@s[1]; 源代码网推荐 strpcopy(p,"new");{strpcopy函数在字符串结尾自动加0} 源代码网推荐 label1.caption:=strpas(p);{new} 源代码网推荐 label2.caption:=s;{new} 源代码网推荐 label3.caption:=intTostr(integer(s[0]));{4} 源代码网推荐 end; 源代码网推荐 源代码网推荐 源代码网推荐 2、下标为0的字符串标识符存放的是字符串长度,字符型数组基本相当于字符串,但不能存放字符串长度。字符串可以用s:="a string"的形式赋值,但是字符型数组a[ ]不可直接用a:="array"的形式赋值,用此种形式会出现类型不匹配错误,可选用strpcopy函数赋值。 源代码网推荐 源代码网推荐 源代码网推荐 例4: 字符型数组s[ ]相当于字符串,但没有存放字符串长度的位置。 源代码网推荐 源代码网推荐 {s[1]="n" s[2]="e" s[3]="w" s[4]=0;} 源代码网推荐 {p-->"new"} 源代码网推荐 var 源代码网推荐 s:array[1..10] of char; 源代码网推荐 p:pchar; 源代码网推荐 begin 源代码网推荐 {s:="new" char(0); error}{错误} 源代码网推荐 p:=@s[1]; 源代码网推荐 {p:=@s; is not correct} 源代码网推荐 strpcopy(p,"new"); 源代码网推荐 label1.caption:=strpas(p);{new} 源代码网推荐 label2.caption:=s;{new} 源代码网推荐 {label3.caption:=intTostr(integer(s[0]));}{不会出现4, 下 源代码网推荐 超出错误} 源代码网推荐 end; 源代码网推荐 源代码网推荐 源代码网推荐 例5:下标从0开始的字符数组s,s相当于@s[0]。 源代码网推荐 源代码网推荐 { s[0]="n" s[1]="e" s[2]="w" s[3]=0;}{p-->"new"} 源代码网推荐 var 源代码网推荐 s:array[1..10] of char; 源代码网推荐 p:pchar; 源代码网推荐 begin 源代码网推荐 {s:="new" char(0); error}{错误} 源代码网推荐 p:=s; 源代码网推荐 {p:=@s[0] is also correct} 源代码网推荐 strpcopy(p,"new"); 源代码网推荐 label1.caption:=strpas(p);{new} 源代码网推荐 label2.caption:=s;{new} 源代码网推荐 label3.caption:=s[0];{n} 源代码网推荐 end; 源代码网推荐 源代码网推荐 源代码网推荐 3、下标从0开始和从1开始的字符数组地址的表示方法也有细微不同: 源代码网推荐 源代码网推荐 源代码网推荐 例6:下标从1开始的数组a 与下标从0开始的数组b 的比较。 源代码网推荐 源代码网推荐 var 源代码网推荐 a:array[1..10]of char; 源代码网推荐 b:array[0..10]of char; 源代码网推荐 {a:="1..10";}{type mismatch} 源代码网推荐 {b:="0..10";}{type mismatch} 源代码网推荐 begin 源代码网推荐 strpcopy( b, "from 0 to 10"); {正确 因为b即是@b[0] } 源代码网推荐 strpcopy(@b[0], "from 0 to 10"); {正确 与上个表达式 源代码网推荐 果相同} 源代码网推荐 strpcopy(@a[1], "from 1 to 10"); {正确 } 源代码网推荐 strpcopy( a, "from 1 to 10"); {类型匹配错误 因为a即是a[0]} 源代码网推荐 end; 源代码网推荐 源代码网供稿. |
