以下评估为32760
,一个整数:
Debug.Print (20 * 1638 - 1)
但这会引发溢出错误:
Dim t as Integer
t = 1639
Debug.Print (20 * t - 1)
似乎这隐含地期望Integer
返回值,因为如果我执行以下任一操作,则会避免错误。
Dim t as Long
或Debug.print (20 * CLng(t) - 1)
或Debug.Print (20# * t - 1)
是否记录了此行为?
我的假设准确吗?也就是说,整数运算意味着整数返回值,只是在方程中引入一个Long
或Double
值就可以避免错误?
答案 0 :(得分:1)
如果我的逻辑是正确的,Dim
或'维度'是一种告诉应用程序您希望使用某种类型的变量的方法,并且该类型属于一定数量的“#bit”位。 (记忆)。
这将保留系统内存的一部分,该部分已根据您在代码中指示的变量类型分配了一定数量的位。这些位然后定义了多少(如果您熟悉C ++或类似的话,那么您可能已经知道了所有这些......)
整数在VBA中是16位,是签名整数,这意味着我们也可以存储负值,因此限制为32,767,因为这是我们用16位实现的最大数字:< / p>
(通常变量可以保持2 ^ n,其中n =位数)
unsigned 16 bits = 0 - 65,536 (2^16)
signed 16 bits = -32,768 - 32,767
32,767 = 111111111111111 (Binary)
32,768 = 1000000000000000 <--- note the extra bit
这个额外的位是导致&#34;溢出&#34;错误 - 因为产生数字所需的位数溢出内存必须安全存储数据的位数。
我认为计算方法没有记录到这个程度,但是你的代码片段是:
Dim t as Integer
t = 1639
Debug.Print (20 * t - 1)
首先要求t
乘以20,结果为32,780:
20 * t = 20 * 1639 = 32,780
32,780 = 1000000000001100 (Binary)
溢出了Integer
数据类型的位限制。此时系统会在有机会继续进行剩余计算之前抛出错误,因为它会尝试将t
乘以其所分配的内存地址,其中只保留了16位内存。
此外,不将t
声明为类型将强制VBA默认键入Variant
,这将评估t
在计算运行时需要分配更多内存并将其推入<{1}}自动边界。
更新:看起来VBA只允许等式中变量所占的最大位数作为返回值,如下例所示:
Long
虽然我不相信这在任何地方都有记录,但这会让人相信VBA会将内存使用量限制为变量在任何时候使用的最高位数。