由Delphi计算的错误值

时间:2015-01-19 23:22:55

标签: 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),这实际上是正确的值。

通过查看高位,我认为这是一个溢出问题。当我打开溢出检查时,第一行停止,异常" 整数溢出"。这对我来说更加困惑,因为 D Double ,我只将值存储到 D

有人可以澄清吗?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

D是双精度的事实并不影响X,Y和Z的类型。这些是Integer s,并且显然不足以存储此类的方块大数,它们的乘法是溢出的。你为什么不宣称它们是双打?