先看一段代码:
const
  t1=5;{无类型常量}
  t2:integer=5;{有类型常量}
var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
   showmessage('t1所占内存大小为:'+inttostr(sizeof(t1))+' 字节 ');
   showmessage('t1数据类型的最大值:'+inttostr(High(t1))+#13#10+'t1数据类型的最小值:'+inttostr(low(t1)));
end;procedure TForm1.Button2Click(Sender: TObject);
begin
   showmessage('t2所占内存大小为:'+inttostr(sizeof(t2))+' 字节 ');
   showmessage('t2数据类型的最大值:'+inttostr(High(t2))+#13#10+'t2数据类型的最小值:'+inttostr(low(t2)));
end;我在Delphi7中经过测试,以上代码测试后t1大小为1字节,最大值为127,最小值为0,而ShortInt类型的范围为-128~127,那t1是否为ShortInt类型呢?如果不是那是什么类型的常量

解决方案 »

  1.   

    Delphi自动为常量分配内存,根据具体的值来确定所需分配类型的大小。
    这里,可以认为是ShortInt类型,也可以认为是byte类型,他们所占用的内存大小相同。
      

  2.   

    这个问题有点奇怪,
    本来编译器会为常量分配一个最适合的数据类型
    按目前所知应该分配byte,但这里又不是。
    或许delphi还有我们所不知道的数据类型
      

  3.   

    第一次看到这样的问题,楼主真是有心人啊,Delphi对Const常量声明做了优化,但搞不清楚的为什么出现0.127,查了很多资料都查不到,期待答案
      

  4.   

    常量声明类型时是运行期常量,会记录在pe文件的常量段,在运行时通过读取内存确定值
    而无类型的常量则是编译期常量,在代码中只相当于宏替换,就是用立即数替换代码中的相应位置换句话说,对有类型的常量可以取地址,而无类型的则不能通过编译(字符串常量在许多方面看起来会有点儿特殊,但实际上没什么特别的,编译器只能那么做)
    而在需要用立即数定义的地方(如定义一个类型 type Tfoo=1..N),使用有类型的常量无法通过编译对于立即数来说,不存在一个基本的类型。具体匹配什么类型,由立即数使用时的某一具体情况来决定,而不存在一个通用的类型。一般来说,按照编译器的通用原则,会用最小能够容纳该立即数的类型来匹配