gpt4 book ai didi

delphi - 文件大小计算、Int64以及32bit和64bit的区别

转载 作者:行者123 更新时间:2023-12-03 15:45:35 36 4
gpt4 key购买 nike

我在使用以下代码时遇到问题:

var
FileSize : Int64;
...
FileSize := Info.nFileSizeLow or (Info.nFileSizeHigh shl 32);

由于赋值左侧的 Int64 类型,我希望它能够工作。但事实并非如此。包含 shl 的部分计算似乎会产生溢出。

所以我把它改为:

FileSize := Info.nFileSizeLow or (Int64 (Info.nFileSizeHigh) shl 32);

它适用于我的 32 位操作系统,但不适用于 Vista 64 位!

最后,

FileSize := Info.nFileSizeHigh;
FileSize := FileSize shl 32;
FileSize := Info.nFileSizeLow or FileSize;

适用于两个系统。

谁能解释一下这三个版本的区别吗?

最佳答案

一般来说,表达式a * b的类型,其中ab的类型为Integer和* 是适用于 Integer 的运算符,是与 Integer 范围相同的整数类型。 (我说的是一般情况,/ 是一个异常(exception)。)为了让运算符使用 64 位运算,一个或多个操作数必须具有只能用 64 位来表示的范围。类型。这应该会导致所有操作数都提升为 64 位,并执行 64 位操作。

事实上,赋值的左侧是 64 位位置,这一事实通常不会影响赋值运算符右侧表达式的解释和键入。这是我所知道的几乎所有静态分派(dispatch) 32 位和 64 位运算符重载的语言的方式(与任意精度整数或数字塔等上的多态分派(dispatch)运算符相反);让事物以其他方式表现将是非常令人惊讶的行为。

例如,过程调用的参数实际上是对参数的隐式赋值。如果赋值的左侧可以更改右侧表达式的解释,那么在不知道定义的情况下,我们将不知道如何解释过程调用的参数:

var a, b: Integer;
// ...
P((a shl 16) or b); // 32-bit operation or 64-bit operation?

我不知道为什么您在第二个和第三个版本的代码中看到不同的行为。据我所知,它们应该被解释为相同,并且在我的测试中,它们被解释为相同。如果您可以提供在 32 位 Windows 上运行但在 64 位 Windows 上失败的示例代码,我可以进一步调查。

关于delphi - 文件大小计算、Int64以及32bit和64bit的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959032/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com