所以我知道在 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 字节 - -251658331
4 294 552 366 字节 - -414930
4 298 779 628 字节 - 3812332
我试图用这个做一些数学运算,但我无法弄清楚它的逻辑。
有人可以解释在后台发生了什么以及为什么我会得到这些结果吗?
最佳答案
我有一个 7GB 的文件用于测试,这是我得到的:
实际文件大小为 7017693184 Bytes,=
110100010010010011000000000000000
(64 位整数中的 33 位,想象左边有更多的零来填充 64 位)。
FileLen 显然只是截断该值并采用低 32 位。
它为确实是的文件返回-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"
关于VBA - "Long"如何在 VBA 中工作 - 玩溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33185915/