使用立即窗口进行一些调试,我遇到了以下为此问题而简化的以下内容:
运行此命令:
?20000*2
产生“溢出”错误。我们假设这是因为我们没有声明数据类型,并且VBE假设Integer
- 结果超出了有符号整数的边界,因此发生了溢出。
但是,如果我跑:
?39999+1
我按预期得到40000
。
这是因为我最初是以Long
而不是Integer
(即20,000与39,999)开始的吗?因此,根据初始输入数据而不是计算结果来分配存储器?
答案 0 :(得分:6)
那是对的。 VBA将采用最大的输入组件并为结果分配内存。由于第一个例子中的两个组件都是Int,所以你得到的就是。
您可以使用类型声明字符强制VBE将数字视为特定数据类型
?20000&*2
40000
?20000*2&
40000
在这两个例子中,& (长类型声明字符)强制将内存分配为Long。它是第一个组件还是后一个组件并不重要。我认为有些操作会被强制转换为特定的数据类型。指数就是其中之一。
?2^2^2^2^2^2
4294967296
?typename(2^2^2^2^2^2)
Double
即使所有组件都是整数,结果也是双倍的 - 即使它不是必须
?typename(2^2)
Double
答案 1 :(得分:5)
此隐式输入不仅限于立即窗口。您的代码中可能会出现相同的溢出:
Sub foo()
Dim x As Long
x = 20000 * 2 'Overflow error
End Sub
此外,当String
隐式转换为数字类型时,它会被转换为Double
:
?TypeName("123" + 6)
Double