VBA - "Long"如何在 VBA 中工作 - 玩 owerflow



所以我知道在Excel VBA中,Long范围是-2,147,483,648 to 2,147,483,647

我现在正在试验文件大小处理和溢出,我想知道当我溢出范围时究竟会发生什么。

所以在代码中,我要求用FileLen函数以字节为单位的文件大小。

如果文件大于2,147,483,647 bytes,我将获得的消息将是负值。我认为这是因为函数将开始使用负值,因为它用完了正值。

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

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

我试着做了一些数学计算,但我不能找出它的逻辑。
有人能解释一下在后台发生了什么,为什么我得到这些结果吗?

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

110100010010010011000000000000000

(一个64位整数有33位数字,想象一下左边有更多的零来填满64位数字)。
FileLen显然只是截断值并采用较低的32位。对于确实是

的文件,它返回-1572241408字节
 10100010010010011000000000000000 

=几乎一样,只是在开头剪掉了一个。
从现在起,在这个32位整数中,MSB(最高有效位,即。最左边的"1"被设置,这就变成了一个负数(如果你想了解更多,在这里阅读更多)
这是相当奇怪的,该方法最好抛出一个溢出错误。

解决方案

:
似乎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"

最新更新