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

标签 vba excel integer-overflow

所以我知道在 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 字节 - -2516583314 294 552 366 字节 - -4149304 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/

相关文章:

javascript - 从 VBA 调用 JavaScript

excel - 如何在双引号内输出公式的结果?

vba - SolverOptions : How to find the parameter position (AssumeNonNeg)?

c++ - 指针算术困惑或奇怪的行为

javascript - 为什么 << 32 在 javascript 中不会导致 0?

c - 将 unsigned int 与 unsigned int 相加时发生溢出

vba - 从命令行启动 VBA 宏 (Excel)

sql-server - 更新 Excel 宏中的多个 SQL 连接字符串

将单个语句包装在 try except block 中的 Python 干净方法

excel - Excel 中的 TIMEVALUE 转换大于 24 小时