VBA - "Long" 如何在 VBA 中工作 - 玩溢出

VBA - how does "Long" work in VBA - playing with owerflow

所以我知道 Excel VBA, Long 运行ge 是 -2,147,483,648 to 2,147,483,647

我现在正在试验文件大小处理和溢出,我想知道当我溢出 运行ge 时到底发生了什么。

因此在代码中,我使用 FileLen 函数请求以字节为单位的文件大小。

如果文件大于2,147,483,647 bytes,我将收到的消息将为负值。我认为这是因为该函数将开始使用负值,因为它 运行 不是正值。

有趣的是,当我 运行 在一些更大的文件上使用函数时: 其中一个是 4 294 552 366 bytes,另一个是 4 298 779 628 bytes
一个我得到了预期的负值,另一个我又得到了一个正值。

结果:
4 043 308 965 字节 - -251658331
4 294 552 366 字节 - -414930
4 298 779 628 字节 - 3812332

我试着用它做一些数学运算,但我无法弄清楚它的逻辑。
谁能解释一下后台发生了什么,为什么我会得到这些结果?

我有一个 7GB 的文件用于测试,这是我得到的: 实际文件大小为 7017693184 字节,=

110100010010010011000000000000000

(64位整数中的33位数字,想象一下左边更多的零可以填满64位数字)。
FileLen 显然只是截断值并采用较低的 32 位。 它 returns -1572241408 字节的文件确实是

 10100010010010011000000000000000 

=几乎一样,只是在开头截掉了一个1。
由于现在在这个 32 位整数中设置了 MSB(最高有效位,即最左边的“1”),这变成了一个负数(如果您想了解更多信息,read more here
这很奇怪,该方法最好抛出溢出错误。

解决方法:
FileSystemObject 似乎可以处理大文件:

Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.Getfile(..filename..)
MsgBox _
    f.Size & " Byte" & _
    vbCrLf & f.Size / 1024 & " KB" & _
    vbCrLf & f.Size / 1024 / 1024 & " MB"