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"
所以我知道 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"