delphi与java 类型转换_Delphi的类型转换 good

Delphi是一种强类型转换的语言。在VC中,赋值符用″=″,例如x=1;到了Delphi赋值符就变成了″:=″,例如x:=1。 从赋值时用符号″:=″而不用″=″,就隐约可见Delphi对类型匹配要求之严,即赋值符右边的类型一定要和左边一致。用惯了VB或VC的程序员,初用Delphi,稍不留神,就会出现类型不匹配的错误。对初学者而言,类型转换也是学习Delphi的重点和难点,为此本文特对Delphi的类型转换做一总结,以供读者参考。

一、数的类型转换

把表达式的类型从一种类型转化为另一种类型,结果值是把原始值截断或扩展,符号位保持不变。例如:

数的类型转换

举例

字符转换为整数

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;

4、获取整数的高16位和低16位

使用HiWord方法和LoWord方法.

var IntValue: Integer;

Hiw: Word;

Low: Word;

begin

Hiw:= HiWord(IntValue);

Low:= LoWord(IntValue);

//IntValue:= (Hiw shl 16)+ Low;

end;

http://blog.csdn.net/henreash/article/details/3956493

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值