使用“立即”窗口进行一些调试,我发现了以下内容,并为此问题进行了简化:
运行此命令:
?20000*2产生“溢出”错误。让我们假设这是因为我们没有声明数据类型,而VBE假设了Integer --结果不属于有符号整数的边界,因此会发生溢出。
然而,如果我跑:
?39999+1我得到了预期的40000。
这是因为我最初使用的是Long而不是Integer (即20,000 vs 39,999)?因此,内存是根据初始输入数据而不是计算结果分配的?
发布于 2015-04-17 18:15:33
是这样的。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发布于 2016-12-22 22:30:55
这种隐式类型并不局限于直接窗口。代码中也可能出现相同的溢出:
Sub foo()
Dim x As Long
x = 20000 * 2 'Overflow error
End Sub此外,当String隐式转换为数字类型时,它被转换为Double
?TypeName("123" + 6)
Doublehttps://stackoverflow.com/questions/29565624
复制相似问题