以下几句(Pascal类型转换的代码)看不懂,特来请教!(100分)

  • 主题发起人 主题发起人 maple_guo
  • 开始时间 开始时间
M

maple_guo

Unregistered / Unconfirmed
GUEST, unregistred user!
代码:
type
  TByteRec = record
    Lo, Hi: Byte;
  end;

  TWordRec = record
    Low, High: Word;
  end;

  PByte = ^Byte;
var
  B: Byte;
  W: Word;
  L: Longint;
  P: Pointer;
begin
  W := $1234;
  B := TByteRec(W).Lo
 //??
  TByteRec(W).Hi := 0
 //??
  L := $01234567;
  W := TWordRec(L).Low
 //??
  B := TByteRec(TWordRec(L).Low).Hi
 //??
  B := PByte(L)^
 //??
end;

1、以上找‘?’的几句怎样理解?
2、可以这样转换吗?
3、转换的依据是什么?
4、为什么要这样做呢?

谢谢!
 
强制转换
 
begin
W := $1234;
B := TByteRec(W).Lo
//?? 此时 B 为W 低字节 $34
TByteRec(W).Hi := 0
//?? 此时 W 为 $34, 高字节清0
L := $01234567;
W := TWordRec(L).Low
//?? W = $4567
B := TByteRec(TWordRec(L).Low).Hi
//?? B = $45
B := PByte(L)^
//?? B = 地址$01234567内存储的数值
end

这样做的依据就是Intel处理器存储数据是低字节在前,高字节在后, 因此可以
把一个字或者长字变换成2个或4个字节处理
 
to tseug:
谢谢你的回复!但我还不是很明白这样做的依据?

按照你的意思:
W := $1234
//Intel处理器存储数据成:34 12?是这样吗?
L := $01234567
//67 45 23 01?

但我不明白的是,
代码:
type
  TByteRec = record
    Lo, Hi: Byte;
  end;

  TWordRec = record
    Low, High: Word;
  end;
两个都是用户自定义的类型,为什么TByteRec(W).Lo就等于$34;TByteRec(W).Hi就等于$12呢?
如果我把TWordRec定义成:
代码:
  TWordRec = record
    WRL, WRH: Word;
  end;
的话,是否也有:
代码:
TWordRec(L).WRL = $4567
TWordRec(L).WRH = $0123
了呢?为什么?
 
和此结构的存贮有关系。首先,整个结构的存贮空间大小与longint适应或小于longint 的
占用空间。 二、在结构中,Lo 、Hi 的存放次序确定并必定和 longint的某固定范围对应
 
是的, IntelCPU 的寻址方式就是这样的. 在不考虑对齐时, Delphi的Record
就是按照声明顺序存放的.
内存地址 数据内容 TByteRec TWordRec TWordRec
00 67 Lo Low WRL
01 45 Hi Low WRL
02 23 High WRH
03 01 High WRH
 
TByteRec的内存分布,占2字节:XXYY。XX为Lo,YY为Hi。
TWordRec的内存分布,占4字节:XXXXYYYY。XXXX为Low,YYYY为High。
w=$1234;Word类型,内存分布,占2字节:3421。
强制转换为TByteRec后,Lo=$34;Hi=$12。

L=$01234567;长整类开,内存分布,占4字节:67452301
强制转换为TWordRec后,Low=$4567;High=$0123
 
接受答案了,谢谢各位!
 
多人接受答案了。
 
后退
顶部