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內部的未公開的秘密:
var p:pbyte;ch:char;
p:=ptr(getcurrenttask,$fa);
ch:=char(p^);
p:=ptr(getcurrenttask,$fa+1);
ch:=char(p^);
三、字串string 字元陣列與指向字
符串的指標pchar的區別與聯絡
這3者的基本概念相同,但有一些非常細微的差別,在程式設計時稍不注意就會出錯,需高度重視。
1、使用指向字串的指標,如果不是以0結尾,執行時就會出現錯誤。為了避免這種錯誤,需要在字串結尾人工加入0 即char(0),或用strpcopy函式在字串結尾自動加0。
例1: 指向字串的指標,如果不是以0結尾,執行時會出現錯誤:
var
s:string;
p:pchar;
begin
s:='new';
label1.caption:=s;
label2.caption:=inttostr(integer(s[0]));
p:=@s[1];
label3.caption:=strpas(p);
end;
例2:在字串結尾人工加入0即char(0),可使用指向字串的指標。
var
s:string;
p:pchar;
begin
p:=@s[1];
s:='new'+char(0);
label1.caption:=strpas(p);
label2.caption:=s;
label3.caption:=inttostr(integer(s[0]));
var
s:string;
p:pchar;
begin
p:=@s[1];
strpcopy(p,'new');
label1.caption:=strpas(p);
label2.caption:=s;
label3.caption:=inttostr(integer(s[0]));
end;
2、下標為0的字串識別符號存放的是字串長度,字元型陣列基本相當於字串,但不能存放字串長度。字串可以用s:='a string'的形式賦值,但是字元型陣列a[ ]不可直接用a:='array'的形式賦值,用此種形式會出現型別不匹配錯誤,可選用strpcopy函式賦值。
例4: 字元型陣列s[ ]相當於字串,但沒有存放字串長度的位置。
var
s:array[1..10] of char;
p:pchar;
begin
p:=@s[1];
strpcopy(p,'new');
label1.caption:=strpas(p);
label2.caption:=s;
end;
例5:下標從0開始的字元陣列s,s相當於@s[0]。
var
s:array[1..10] of char;
p:pchar;
begin
p:=s;
strpcopy(p,'new');
label1.caption:=strpas(p);
label2.caption:=s;
label3.caption:=s[0];
end;
3、下標從0開始和從1開始的字元陣列位址的表示方法也有細微不同:
例6:下標從1開始的陣列a 與下標從0開始的陣列b 的比較。
var
a:array[1..10]of char;
b:array[0..10]of char;
begin
strpcopy( b, 'from 0 to 10');
strpcopy(@b[0], 'from 0 to 10');
strpcopy(@a[1], 'from 1 to 10');
strpcopy( a, 'from 1 to 10');
end;
Delphi的型別轉換
delphi是一種強型別轉換的語言。在vc中,賦值符用 例如x 1 到了delphi賦值符就變成了 例如x 1。從賦值時用符號 而不用 就隱約可見delphi對型別匹配要求之嚴,即賦值符右邊的型別一定要和左邊一致。用慣了vb或vc的程式設計師,初用delphi,稍不留神,就會出現型別不匹配的錯誤。對...
Delphi的型別轉換
delphi是一種強型別轉換的語言。在vc中,賦值符用 例如x 1 到了delphi賦值符就變成了 例如x 1。從賦值時用符號 而不用 就隱約可見delphi對型別匹配要求之嚴,即賦值符右邊的型別一定要和左邊一致。用慣了vb或vc的程式設計師,初用delphi,稍不留神,就會出現型別不匹配的錯誤。對...
Delphi 型別轉換筆記
一.byte word integer幾種資料型別的相互轉換 1.取byte值,然後轉換成2進製字串,然後字串相加,再轉換為int的,但太羅嗦了 integer byte1 shl 8 integer byte2 2.使用巨集 word makeword byte blow,bhigh 例如 fun...