我有一条声明为
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溢出”。这让我更加困惑,因为D是Double,而我只将值存储到D中
任何人都可以澄清一下吗?
赋值语句的目标与右侧的评估方式无关。在右侧,您所拥有的都是type Integer
,因此表达式将被评估为该类型。
如果要将右侧的值评估为其他类型,则至少一个操作数必须具有该类型。当您将语句分成多个步骤并合并D
到表达式的右侧时,您亲眼目睹了这一点。的值V.Y * V.Y
仍被评估为type Integer
,但是结果被提升为具有type的值Double
,以使其与加法项(D
)中另一个操作数的类型匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句