问一下:强制类型转换的原理

Linquanwuzhong 2008-03-16 09:36:24
在Delphi中,
我可以这样写代码: if Boolean(TreeView1.items) then ....
也可以 TEdit(Sender)这样写,以及对象类型向上转,或向下转.这些都会用,就是想问一下,为什么可以这样转换? 如果从内存取字节的角度怎么解释?(我没学过汇编).
...全文
285 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ADelphiCoder 2008-03-17
  • 打赏
  • 举报
回复
具体信息,RTTI
lihuasoft 2008-03-17
  • 打赏
  • 举报
回复
奇怪,我回了贴竟然不显示。再回一遍。

[Quote=引用楼主 Linquanwuzhong 的帖子:]
如果从内存取字节的角度怎么解释?
[/Quote]

下面是我的一个学习笔记,言论幼稚,请勿笑话,仅供参考。
http://topic.csdn.net/u/20070101/23/049021c1-b573-481f-9c3b-f976178ed31b.html
Linquanwuzhong 2008-03-17
  • 打赏
  • 举报
回复
RTTI,都看完了,没提到强制类型转换的根本原理.楼上的图不是太理解,能具体解释一下吗?谢谢.
etomahawk 2008-03-17
  • 打赏
  • 举报
回复
|--------------| ---------------------------------------------------
| TObject | |---- TObject的可见范围 | |
|--------------| -- | -- TPersist的范围 |
| TPersist | | |
|--------------| ---------------------------- | -- TMyObj的可见范围
| ........ | |
|--------------| |
| TMyObj | |
|--------------| ---------------------------------------------------

看完上面的图,估计你就应当明白了。
lihuasoft 2008-03-17
  • 打赏
  • 举报
回复
仅供参考:
http://topic.csdn.net/u/20070101/23/049021c1-b573-481f-9c3b-f976178ed31b.html
是我学习笔记,幼稚言论,请勿笑话,仅供参考
Linquanwuzhong 2008-03-17
  • 打赏
  • 举报
回复
给你加分了,我的问题你回答了85%,已经很不错了.有些问题是我的基础太差的缘故.
lihuasoft 2008-03-17
  • 打赏
  • 举报
回复

($) 00 00 00 FF ---- Win32下,Integer、LongInt、LongWord、Cardinal等类型的长度,4个字节
($) FF ---- Win32下,Byte、Char、SortInt等类型的长度,1个字节
lihuasoft 2008-03-17
  • 打赏
  • 举报
回复
$FF就是一个字节啊,前面的($)000000正好是三个字节

十六进制: F F
二 进 制:1111 1111 (8位)
Linquanwuzhong 2008-03-17
  • 打赏
  • 举报
回复
可以给你加分了.我目前只要知道这些了.

还需继续问一个问题:
难道$000000是高位字节,而$FF是地位字节?我知道$0000是高位字,而$00FF应该是低位字.变量I是4个字节的,Byte(I)是一个字节的,那为什么取$FF呢?
lihuasoft 2008-03-17
  • 打赏
  • 举报
回复
续上:
上面测试用的是正数
如果是负数,就复杂多了,因为负数的补码与原码不一致
如果用实数测试,就更复杂了

呵呵~ 我是无能力陪你测试下去了
lihuasoft 2008-03-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Linquanwuzhong 的回复:]
楼上的举例都是内存中存储字节相同的,如果不同呢?你没有做介绍.假设一个变量占一个字节,一个变量占有4个字节,这样的变量又是怎样的转换的呢?
[/Quote]
//强制类型转换,要有人为的控制
//不同长度的类型互相转换,不是不可以,但应做好控制
//类类型的转换,可以按楼上诸位说的,参阅RTTI有关文档

procedure TForm1.Button1Click(Sender: TObject);
var
B: Byte;
I: LongWord;
begin
//测试一:长数据类型向短数据类型转换,高位字节舍去
I := $000000FF;
B := Byte(I);
if B = $FF then Showmessage('OK');
//如果把I的高位的三个字节的$000000换成任意数字,转换后都是$FF

//测试二:短数据类型向长数据类型转换,高位填0
B := $FF;
I := LongWord(B);
Showmessage(Format('%.8x', [I]));
end;

Linquanwuzhong 2008-03-17
  • 打赏
  • 举报
回复
但是楼上前面的几点讲的比较好,故收藏.
Linquanwuzhong 2008-03-17
  • 打赏
  • 举报
回复
楼主讲的好,有65%的解决了我的疑惑.但是在讲本质的时候,我不是很理解楼上的意思.
还有,楼上的举例都是内存中存储字节相同的,如果不同呢?你没有做介绍.假设一个变量占一个字节,一个变量占有4个字节,这样的变量又是怎样的转换的呢?

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧