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