Delphi计算出的值有误

罗日

我有一条声明为

T3DVector = record
  X,Y,Z: Integer;
end;

T3DVector类型的一个变量V保持:

V.X= -25052
V.Y=  34165
V.Z=  37730

然后,我尝试执行以下行。D被声明为Double

D:= (V.X*V.X) + (V.Y*V.Y) + (V.Z*V.Z);

返回值为:-1076564467(0xFFFFFFFFBFD4EE0D)

以下代码应等效:

D:= (V.X*V.X);
D:= D + (V.Y*V.Y);
D:= D + (V.Z*V.Z);

但是,这将返回3218402829(0x00000000BFD4EE0D),它实际上是正确的值。

通过查看高位,我认为这是一个溢出问题。当我打开溢出检查时,第一行暂停,但异常“ Integer溢出”。这让我更加困惑,因为DDouble,而我只将值存储到D中

任何人都可以澄清一下吗?

罗伯·肯尼迪

赋值语句目标与右侧的评估方式无关。在右侧,您所拥有的都是type Integer,因此表达式将被评估为该类型。

如果要将右侧的值评估为其他类型,则至少一个操作数必须具有该类型。当您将语句分成多个步骤并合并D到表达式的右侧时,您亲眼目睹了这一点的值V.Y * V.Y仍被评估为type Integer,但是结果被提升为具有type的值Double,以使其与加法项(D)中另一个操作数的类型匹配

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章