这几天急着进入富农阶层,因此放分少一点,莫怪言归正传。以下代码在Delphi7运行,看结果,莫非是Delphi的BUG?
var
  I: integer;
begin
  I := 2147483648;{虽然有提示,但仍能通过编译}
  Showmessage(BoolToStr(I>0, True)); {False!}
  Showmessage(IntToStr(High(Integer)));{2147483647!}  //I := -2147483648; {报错,无法通过编译}
  I := Low(Integer); {但这样就可以了}
  Showmessage(IntToStr(I)); {-2147483648}
end;
如果是BUG,该打哪一个补丁?www.delphifans.com下载安装了Delphi7专业版Update1,无改变。谢

解决方案 »

  1.   

    2147483648 = $80000000
    最高位为1,即,它作为32位的有符号数integer时,它是个负数(其实就是数:-2147483648)简单来说:integer的表数范围是 2147483647 至 -2147483648正数2147483648超过了integer的表数范围,改用Int64吧。
      

  2.   

    刚刚查了下书
    Integer的范围  -32768——32767  
    Longint的范围  -2147443648 到 2147443647
      

  3.   

    最高位为1,即,它作为32位的有符号数integer时,它是个负数(其实就是数:-2147483648) 这个应该是最大的负数了,
    如果还继续往上,2147483649,2147483650,.....最后到$FFFFFFFF,就是DWORD(-1)了.
      

  4.   

    to 蒲石、suton :2147483648已经超出32位机Integer的取值范围,这个很清楚,并且书上也写得很明白了。问题是
    var
      I: integer;
    begin
      I := 2147483648;{明明超出范围,为什么只有提示,但仍能通过编译,而(继续往下看)}
      Showmessage(BoolToStr(I>0, True)); {这个很明白,只是为了说明问题}
      Showmessage(IntToStr(High(Integer)));{这个同上}  //I := -2147483648; {--------这个按书上说的,应该不报错啊,为什么直接无法通过编译呢}
      I := Low(Integer); {----------并且,同是一个值,为什么这样做就可以了呢?(下一句是验证同值)}
      Showmessage(IntToStr(I)); {-2147483648}
    end;
      

  5.   

    不会是编译器编译时先转换成16进制,但这个转换时有点小问题.
      asm
      mov ebx,$80000000
      end;
      I := $80000000; 
      I := -2*1073741824;
    用以上3句任何一句代替都能顺利编译.
      

  6.   

    复习 移码 知识,就认为这个是正常现象了…
    或者记得常常打开下CPU和Memory窗口
      

  7.   

    我用d6是可以编译通过的,结果是:
    var
      I: integer;
    begin
      I := 2147483648;{虽然有提示,但仍能通过编译}
      Showmessage(BoolToStr(I>0, True)); {False!}
      Showmessage(IntToStr(High(Integer)));{2147483647!} I := -2147483648; {无错,编译通过}
      Showmessage(IntToStr(I)); {结果为-2147483648}
     I := Low(Integer); {但这样就可以了}
      Showmessage(IntToStr(I)); {-2147483648}
    估计是d7的问题
      

  8.   

    明天上午结贴,无论有无确切答案。结贴后,各位发现有什么针对这BUG的好补丁告诉俺。
      

  9.   

    我用Delphi 2009测试你的代码。
    var
      I: integer;
    begin
      I := 2147483648;{提示:Constant expression violates subrange bounds}
      Showmessage(BoolToStr(I>0, True)); {这个很明白,只是为了说明问题}
      Showmessage(IntToStr(High(Integer)));{这个同上}  //I := -2147483648; {Delphi 2009 正常编译通过}
      I := Low(Integer); {----------并且,同是一个值,为什么这样做就可以了呢?(下一句是验证同值)}
      Showmessage(IntToStr(I)); {-2147483648}
    end;用D7确实有问题。可能的确是D7的BUG.
      

  10.   

    感谢 蒲石兄 帮测D2009!现在可以确信它是BUG了
      

  11.   

    I := 2147483648;可以通过,甚至 I := 3147483648; 都可以通过。个人认为是可以接受的。可以不算是BUG.至于I := -2147483648; 编译不能通过就的确不合理了。好在delphi 2009里是可以编译通过的。