jpf*_*ius 3 delphi delphi-2010
我遇到以下代码问题:
var
FileSize : Int64;
...
FileSize := Info.nFileSizeLow or (Info.nFileSizeHigh shl 32);
Run Code Online (Sandbox Code Playgroud)
我期望它能够工作,因为Int64任务的左侧类型.但事实并非如此.包含shl似乎产生溢出的部分计算.
所以我改成了:
FileSize := Info.nFileSizeLow or (Int64 (Info.nFileSizeHigh) shl 32);
Run Code Online (Sandbox Code Playgroud)
它适用于我的32位操作系统,但不适用于Vista 64位!
最后,
FileSize := Info.nFileSizeHigh;
FileSize := FileSize shl 32;
FileSize := Info.nFileSizeLow or FileSize;
Run Code Online (Sandbox Code Playgroud)
适用于两个系统.
有人可以解释这三个版本的差异吗?
一般来说,表达式的类型a * b,其中a和b类型为Integer,*是一个适用于Integer的运算符,是一个整数类型,其范围与Integer相同.(我通常说,作为一个例外/.)为了让操作员使用64位操作,一个或多个操作数必须具有只能用64位类型表示的范围.这应该导致所有操作数被提升为64位,并执行64位操作.
赋值的左侧是64位位置的事实通常对赋值运算符右侧的表达式的解释和键入没有影响.这就是我所知道的几乎所有语言都有静态调度的32位和64位运算符重载的方式(与任意精度整数或数字塔上的多态调度运算符相反); 使事情表现不佳将是非常令人惊讶的行为.
例如,过程调用的参数实际上是对参数的隐式赋值.如果赋值的左侧可以更改右侧表达式的解释,我们将不知道如何在不知道定义的情况下将参数解释为过程调用:
var a, b: Integer;
// ...
P((a shl 16) or b); // 32-bit operation or 64-bit operation?
Run Code Online (Sandbox Code Playgroud)
我不知道为什么你会看到你的第二和第三版代码的不同行为.据我所知,它们应该被解释为相同,在我的测试中,它们的解释是相同的.如果您可以提供适用于32位Windows但在64位Windows上失败的示例代码,我可以进一步调查.
| 归档时间: |
|
| 查看次数: |
2579 次 |
| 最近记录: |