奇怪现象:0<-1竟为true;欢迎高手讨论(0分)

X

x900

Unregistered / Unconfirmed
GUEST, unregistred user!
这是从borland delphi论坛上看到的一个帖子,拿到这里来让富翁们讨论讨论!
原贴内容为在D7下运行下面的代码结果...0<-1竟然为true,why?

{$Align on}
{$Assertions on}
{$BoolEval off}
{$DebugInfo on}
{$ExtendedSyntax on}
{$Hints on}
{$IOChecks on}
{$LocalSymbols on}
{$LongStrings on}
{$MinEnumSize 1}
{$OverflowChecks on}
{$RangeChecks on}
{$SafeDivide off}
{$StackFrames off}
{$TypedAddress on}
{$VarStringChecks on}
{$Warnings on}
{$WriteableConst off}
{$Optimization off}
{$apptype console}

program Test;

procedure Sub( const A: array of string );
var
X: 0..MaxInt;
begin
X := 0;
writeln( X, ' ', high( A ), ' ', X <= high( A ) );
end;
begin
Sub( [] );
end.
 
是奇怪啊,估计是bug吧!
 
这有什么奇怪的,如果是无符号的整数,-1是$FFFFFFFF确实比0大,
上面那么多编译指令,估计是打开了一些选项.
 
没有,我把上面的编译指令全去掉结果一样。
 
估计是DELPHI自己把-1变成了$FFFFFFFF[:D]
 

writeln( X, ' ', high( A ), ' ', X <= high( A ) );
换成
writeln( X, ' ', high( A ), ' ', X <= Integer(high( A )) );
看看就知道了。

Delphi不确定High(A)的类型,确定了就好

 
那各位大侠对下面的代码如何解释?

{$Align on} {$Assertions on} {$BoolEval off}
{$ExtendedSyntax on} {$Hints on} {$IOChecks on}
{$LocalSymbols on} {$LongStrings on} {$MinEnumSize 1}
{$OverflowChecks on} {$RangeChecks on} {$SafeDivide off}
{$StackFrames off} {$TypedAddress on} {$VarStringChecks on}
{$Warnings on} {$WriteableConst off} {$Optimization off}
{$apptype console} {$DebugInfo on}

program Project1;

{$APPTYPE CONSOLE}

procedure Sub( const A: array of string );
var X: cardinal
B: boolean;
begin
X := 0;
B := (X <= high(A))
//在这里单步跟踪时(X <= high(A))为False;赋值给B
//后,B为True;
writeln(X,' ',high(A),' ',X<high(A),' ',B);
//屏幕输出x<high(A)仍然为True,B的输出也为True;
end;

begin
Sub( [] );
readln;
end.
 
问题出在变量x的声明上
var
X: 0..MaxInt;
根据delphi 帮助知道 When you use numeric or character constants to define a subrange, the base type is the smallest integer or character type that contains the specified range.
也就是说x的范围必须在-32768-------32767之间,而MaxInt是2147483647
因此导致运行期间出现如此错误
将x的范围重新定义一下就可以了
 
应该是Delphi的Bug
 
估计张无忌说得对吧!
 
试试下面的:
program Project1;

{$APPTYPE CONSOLE}

procedure Sub( const A: array of string );
var X: cardinal;
b:boolean;
begin
X := 0;
B := x>= high(A)
//在这里单步跟踪时(X <= high(A))为False;赋值给B
//后,B为True;
writeln(X,' ',high(A),' ',X<high(A),' ',high(A)-x);
//屏幕输出x<high(A)仍然为True,B的输出也为True;
end;

begin
Sub( [] );
readln;
end.
 
 应该是跟数据类型有关
not 0 就是$FFFFFFFF.它可表显为-1
 
这怎么能说是BUG呢?
如果因为程序员对指针的地址赋值错误导致出现这样的事情,难道也可以说是BUG吗?
范围指定错误,导致编译期出错,是有可能对地址中的数值按照另外一种格式转换了
张无忌说的仅仅是有可能而已
 
不是有可能,你运行一下我上面的代码看看,现实的就是$FFFFFFFF的十进制形式
 
顶部