VBE immediate window 如何处理文字数字?
How does VBE immediate window handle literal numbers?
使用直接 window 进行一些调试,我遇到了以下内容,我已针对此问题进行了简化:
运行执行此命令:
?20000*2
产生 'overflow' 错误。假设这是因为我们没有声明数据类型,并且 VBE 假设 Integer
- 结果落在有符号整数的边界之外,因此发生溢出。
但是如果我运行:
?39999+1
我得到了预期的 40000
。
这是因为我最初使用的是 Long
而不是 Integer
(即 20,000 对 39,999)吗?因此内存是根据初始输入数据而不是计算结果分配的?
没错。 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
尽管所有分量都是整数,但结果是双精度 - 即使它不一定是
?typename(2^2)
Double
这种隐式类型不限于立即 Window。您的代码中可能会发生相同的溢出:
Sub foo()
Dim x As Long
x = 20000 * 2 'Overflow error
End Sub
此外,当 String
被隐式转换为数字类型时,它被转换为 Double
:
?TypeName("123" + 6)
Double
使用直接 window 进行一些调试,我遇到了以下内容,我已针对此问题进行了简化:
运行执行此命令:
?20000*2
产生 'overflow' 错误。假设这是因为我们没有声明数据类型,并且 VBE 假设 Integer
- 结果落在有符号整数的边界之外,因此发生溢出。
但是如果我运行:
?39999+1
我得到了预期的 40000
。
这是因为我最初使用的是 Long
而不是 Integer
(即 20,000 对 39,999)吗?因此内存是根据初始输入数据而不是计算结果分配的?
没错。 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
尽管所有分量都是整数,但结果是双精度 - 即使它不一定是
?typename(2^2)
Double
这种隐式类型不限于立即 Window。您的代码中可能会发生相同的溢出:
Sub foo()
Dim x As Long
x = 20000 * 2 'Overflow error
End Sub
此外,当 String
被隐式转换为数字类型时,它被转换为 Double
:
?TypeName("123" + 6)
Double