4

使用即时窗口进行一些调试,我遇到了以下我为这个问题的目的而简化的内容:

运行此命令:

?20000*2

产生“溢出”错误。假设这是因为我们没有声明数据类型,而 VBE 已经假设Integer- 结果超出了有符号整数的边界,因此发生了溢出。

但是,如果我运行:

?39999+1

我得到40000了预期。

这是因为我最初是从 aLong而不是 a 开始的Integer(即 20,000 对 39,999)?因此内存是根据初始输入数据而不是计算结果分配的?

4

2 回答 2

6

这是正确的。VBA 将采用最大的输入组件并为结果分配内存。由于第一个示例中的两个组件都是 Int,这就是您所得到的。

您可以使用类型声明字符来强制 VBE 将数字视为某种数据类型

?20000&*2
 40000 
?20000*2&
 40000 

在这两个示例中,&(Long 类型声明字符)强制将内存分配给 Long。它是第一个组件还是后一个组件都没有关系。我认为有些操作会被强制转换为特定的数据类型。幂运算就是其中之一。

?2^2^2^2^2^2
 4294967296 
?typename(2^2^2^2^2^2)
Double

即使所有组件都是整数,结果也是 Double - 即使它不一定是

?typename(2^2)
Double
于 2015-04-17T18:15:33.863 回答
5

这种隐式类型不限于立即窗口。您的代码中可能会发生相同的溢出:

Sub foo()

  Dim x As Long

  x = 20000 * 2 'Overflow error

End Sub

此外,当 aString被隐式转换为数字类型时,它被转换为 a Double

?TypeName("123" + 6)
Double
于 2016-12-22T22:30:55.293 回答