Delphi 计算出的值错误

Wrong value calculated by 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);

return值为:-1076564467 (0xFFFFFFFFBFD4EE0D)

下面的代码应该是等价的:

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

但是,returns 3218402829 (0x00000000BFD4EE0D),这实际上是正确的值。

看高位,以为是溢出问题。当我打开溢出检查时,第一行停止并出现异常“Integer overflow”。这让我更加困惑,因为 DDouble,而我只将值存储到 D

有人可以澄清一下吗?

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

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

D 是双精度数这一事实不会影响 X、Y 和 Z 的类型。它们是 Integer,显然不够大,无法存储此类的平方大数,它们的乘法就是溢出。你为什么不把它们也声明为双打?