关于数据类型的强制转换问题(100分)

  • 主题发起人 主题发起人 sjjwan
  • 开始时间 开始时间
S

sjjwan

Unregistered / Unconfirmed
GUEST, unregistred user!
var
a: Integer;
b: Integer;
a := b + 5,与 a := b + Integer(5);
这两句语句有区别吗?
或者根本没区别,因为在前一句,Delphi会自动转换为Integer型,对数值的强制类型转化,会影响到数值在代码段中占用空间。比如5在代码段中占4个字节。
我说的对吗?
 
两种写法最终生成的机器码都是 lea ebx,[eax+$05] 十六进制机器码为: 8D5805
看来,Delphi的编译器十分的智能,根本就没有给5专门开辟空间来存放,而是直接嵌入
到了指令中(机器码最后的那个05)——当然这是在打开编译优化的情况下。如果关闭编译
优化,最终代码就变成了(两种写法的结果仍然一样):
mov eax,[ebp-$0c]
add eax,$05
mov [ebp-$08],eax
呵呵,同样没有将这个“5”放到数据段中。

因为A和B都是Integer,5本身也能被自动转化,因此,加不加Integer()都一样。
 
喜欢看creation_zy大哥对问题的分析
透彻!
 
我看不懂啊
我说这个常数5本身是不是只在1个字节,但在运算时,需类型转换,所以需一个中间变量,然后在进行运算
 
creation_zy大哥对问题的分析得对。顶!
 
5没有被分配字节,delphi自动识别5。
就像你把原来的卡片a,delphi直接换成了卡片a+5
而不是换成两个卡片a,和卡片5加起来
 
5本身就是个Integer类型的常量
编译器应该会把这个强制类型转换优化掉的
Integer();
 
后退
顶部