Delphi中 强制类型转换的原理是怎样的?(50分)

  • 主题发起人 主题发起人 wuzhonglinquan
  • 开始时间 开始时间
W

wuzhonglinquan

Unregistered / Unconfirmed
GUEST, unregistred user!
RT:Delphi中 强制类型转换的原理是怎样的?
 
比如说
if Boolean(treeView1.items.Count) then
begin
//
edn;
treeView1.items.Count是整形,4个字节,而Boolean是1个字节,这个编译器会截断一部分内存存储空间,我想知道它是怎么截取的就可以了??
 
问题是简单,但不太好回答。要知道编译器如何截断一部分内存存储空间,你只须在Delphi中写上测试指令,然后调试时打开CPU窗口上汇编指令就能能看明白了。像你所给的代码,在CPU窗口中大概会被编译成如下的指令
mov eax,treeView1.items.Count // 先取得Count的值
test al,al // if Boolean(Count) then
,这里就是将eax长整数变成Boolean(al)再测试al的值。
jz @FALSE
......
@FALSE:
......
 
我不知道它是怎么截取的(比如截取的是高字节还是低字节,这个是我蒙的),我怎么知道它返回的是true还是False呢?
 
我认为应该是截掉高位,因为按汇编取位的原理是这样,不知道你做实验后是怎样的?
 
if boolean(1) then
edit1.Text:='1' else
edit1.Text:='0';刚试了下,非零的整形数强制后其结果都是true
 
楼上的那个我明白,我只想知道4个字节高低位都是16位,但是Boolean只有8啊,怎么实现呢?
 
如果把if Boolean(‘A’) then
....
这个好理解,因为'A'占一个字节,Boolean也占一个字节,内存里的01位数不增加不减,就是换了一种解释方式而已。增加我还能理解,大不了就增加01的位数好了,但是截取我就不明白了?
望高手指点一下。
 
一个32位系统的长整数数值最大就是32位的(四个字节),一个Boolean则占一个字节。将一个32位系统的长整数值转换成Boolean类型,则高位的三个字符会被截取,只取最低位的一个字节的值(1~255的值)。比如一个l:LongWord = $12345678的值转换成Boolean则l的数值中的$123456这三个字节数值会被截断,只剩下$78的值保留。而Boolean类型一般只要非零则判断为TRUE,为零则判断为FALSE。所以你将长整转换成Boolean后是TRUE还是FALSE只需看$xxxxxxXX(十六进制)最后两值数值是0还是非0就行了。如例子:
l := $12345600;
if Boolean(l) then
// 这里返回false,因为l的最低位是00,是零,其余前面的$123456则会被截断,不会进行判断。
l := $12345601;
if Boolean(l) then
//这里返回true,因为l的高低位是01,为非零,其余前面的$123456则会被截断,不会进行判断。
 
确实就是截取32位中的低8位作为Boolean的。
不过这个低8位究竟是指32位的哪头,取决于Big endian还是little endian
 
@xiaopei
给你加分之前,还有一个问题.
我们可以这些写代码:
var
ptr:Pointer;
begin

if Boolean(ptr) then
//
end;

ptr是指针,也是4个字节,那应该就是看最后两位是否为0(对十六进制而言)就可以了,但是有些时候系统给我们分配的内存就有最后两位为0,而前几位不为0,这个时候应该是true,而强制类型Boolean(ptr)后,返回的却是False,这样的情况是否存在??
 
如果指针地址最后两位是0,那么会返回False,一般指针不推荐转Boolean类型判断,指针判断一般是用if ptr <> nil then
这样判断比较安全。
 
再问最后一个弱智的问题:十六进制最后两位一般什么时候为0?比如整型数0,还有其他情况吗?
 
说说一般的情况就可以了?
 
这个没有固定的说法。什么时候为零,要看你所给的整数是什么,或者计算的结果是什么而定的。不过,对于32位的整数判断如果不是特殊理由,最好不要用Boolean类型来判断,选用32位的BOOL类型来判断比较好。
 
接受答案了.
 
后退
顶部