溢出错误在VBA中使用整数计算算术表达式

时间:2015-02-25 18:23:59

标签: vba

以下评估为32760,一个整数:

Debug.Print (20 * 1638 - 1)

但这会引发溢出错误:

Dim t as Integer
t = 1639
Debug.Print (20 * t - 1)

似乎这隐含地期望Integer返回值,因为如果我执行以下任一操作,则会避免错误。

Dim t as LongDebug.print (20 * CLng(t) - 1)Debug.Print (20# * t - 1)

是否记录了此行为?

我的假设准确吗?也就是说,整数运算意味着整数返回值,只是在方程中引入一个LongDouble值就可以避免错误?

1 个答案:

答案 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会将内存使用量限制为变量在任何时候使用的最高位数。