所以我知道在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位。对于确实是
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"