以下结果为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
值将避免错误?
如果我的逻辑是正确的,Dim
或者“维数”是一种告诉应用程序您希望使用某种类型的变量的方法,并且该类型与一定数量的“位”(内存)有关。
这将保留系统内存的一部分,该部分已分配了一定数量的位,具体取决于您在代码中指示的变量类型。这些位然后定义了多少(如果您熟悉C ++或类似的语言,那么您可能已经知道所有这些...)
Integer在VBA中为16位,并且是有符号整数,这意味着我们也可以存储负值,因此限制为32,767,因为这是我们可以使用16位实现的最大数字:
(通常,变量可以容纳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
这个额外的位是导致“溢出”错误的原因-因为产生数字所需的位数溢出了内存必须安全存储该位数的位数。
我不认为计算方法已记录到这一程度,但是您的代码段如下:
Dim t as Integer
t = 1639
Debug.Print (20 * t - 1)
将需要t
首先被由20相乘,产生的32780的图:
20 * t = 20 * 1639 = 32,780
32,780 = 1000000000001100 (Binary)
这溢出了Integer
数据类型的位限制。此时,系统在有机会继续进行其余的计算之前会抛出一个错误,因为它试图t
在仍处于分配的内存地址的同时进行乘法运算,为此它仅保留了16位内存。
同样,不声明t
为类型将强制VBA默认为type Variant
,它将评估t
在计算运行时需要分配更多的内存,并将其Long
自动推入边界。
更新:看起来VBA将只允许返回值的公式中的变量持有的最大位数,如以下示例所示:
Sub SO()
Dim t As Integer, c As Long
t = 1639
c = 20
Debug.Print (20 * (t - 1)) '// No Error
Debug.Print (c * (t - 1)) '// No Error
Debug.Print ((c * t) - 1) '// No Error
c = (20 * t - 1) '// Error
Debug.Print (20 * t - 1) '// Error
End Sub
尽管我不相信这在任何地方都有记载,但它会让人们相信VBA将内存使用限制为变量在任何一次所使用的最大位。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句