在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)

是否记录了这种行为?

我的假设正确吗?也就是说,整数算术意味着一个整数返回值,而简单地在方程中引入一个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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

递归评估算术表达式

来自分类Dev

erlang:评估算术表达式时出现异常错误

来自分类Dev

使用MIN时-算术溢出错误将表达式转换为数据类型datetime

来自分类Dev

将表达式转换为数值数据类型的算术溢出错误

来自分类Dev

SQL Server:将表达式转换为数据类型bigint的算术溢出错误

来自分类Dev

SQL算术溢出错误将表达式转换为数据类型nvarchar

来自分类Dev

将表达式转换为数据类型smallint的算术溢出错误

来自分类Dev

SQL Server算术溢出错误将表达式转换为数据类型datetime

来自分类Dev

**偶尔**算术溢出错误将表达式转换为数据类型int

来自分类Dev

“将表达式转换为数据类型nvarchar的算术溢出错误。”

来自分类Dev

存储过程算术溢出错误将表达式转换为数据类型int

来自分类Dev

中间算术表达式中的整数溢出

来自分类Dev

成功执行后,我收到错误:将表达式转换为数据类型int的算术溢出错误

来自分类Dev

SQL Server 2008算术溢出错误将表达式转换为数据类型int

来自分类Dev

SQL:左联接和求和:将表达式转换为数据类型int的算术溢出错误

来自分类Dev

SQL:左联接和求和:将表达式转换为数据类型int的算术溢出错误

来自分类Dev

T-SQL代码中将表达式转换为数据类型int消息的算术溢出错误

来自分类Dev

sql将int转换为datetime,溢出问题将表达式转换为数据类型varchar的算术溢出错误

来自分类Dev

是否可以在FXML中使用算术表达式?

来自分类Dev

如何在终端中使用算术表达式?

来自分类Dev

如何在具有 Group By 子句的 SQL 查询的 where 子句中使用算术表达式而不会出现算术溢出?

来自分类Dev

正则表达式:VBA:使用条件评估表达

来自分类Dev

消息8115,级别16,状态2,第2行算术溢出错误将表达式转换为数据类型int

来自分类Dev

Dijkstra的两层表达式评估算法

来自分类Dev

扩展表达式树评估算法

来自分类Dev

Dijkstra的两层表达式评估算法

来自分类Dev

在Python中使用堆栈评估中缀表达式:我找不到我的错误

来自分类Dev

Java执行算术表达式错误?

来自分类Dev

布尔表达式中的整数溢出

Related 相关文章

  1. 1

    递归评估算术表达式

  2. 2

    erlang:评估算术表达式时出现异常错误

  3. 3

    使用MIN时-算术溢出错误将表达式转换为数据类型datetime

  4. 4

    将表达式转换为数值数据类型的算术溢出错误

  5. 5

    SQL Server:将表达式转换为数据类型bigint的算术溢出错误

  6. 6

    SQL算术溢出错误将表达式转换为数据类型nvarchar

  7. 7

    将表达式转换为数据类型smallint的算术溢出错误

  8. 8

    SQL Server算术溢出错误将表达式转换为数据类型datetime

  9. 9

    **偶尔**算术溢出错误将表达式转换为数据类型int

  10. 10

    “将表达式转换为数据类型nvarchar的算术溢出错误。”

  11. 11

    存储过程算术溢出错误将表达式转换为数据类型int

  12. 12

    中间算术表达式中的整数溢出

  13. 13

    成功执行后,我收到错误:将表达式转换为数据类型int的算术溢出错误

  14. 14

    SQL Server 2008算术溢出错误将表达式转换为数据类型int

  15. 15

    SQL:左联接和求和:将表达式转换为数据类型int的算术溢出错误

  16. 16

    SQL:左联接和求和:将表达式转换为数据类型int的算术溢出错误

  17. 17

    T-SQL代码中将表达式转换为数据类型int消息的算术溢出错误

  18. 18

    sql将int转换为datetime,溢出问题将表达式转换为数据类型varchar的算术溢出错误

  19. 19

    是否可以在FXML中使用算术表达式?

  20. 20

    如何在终端中使用算术表达式?

  21. 21

    如何在具有 Group By 子句的 SQL 查询的 where 子句中使用算术表达式而不会出现算术溢出?

  22. 22

    正则表达式:VBA:使用条件评估表达

  23. 23

    消息8115,级别16,状态2,第2行算术溢出错误将表达式转换为数据类型int

  24. 24

    Dijkstra的两层表达式评估算法

  25. 25

    扩展表达式树评估算法

  26. 26

    Dijkstra的两层表达式评估算法

  27. 27

    在Python中使用堆栈评估中缀表达式:我找不到我的错误

  28. 28

    Java执行算术表达式错误?

  29. 29

    布尔表达式中的整数溢出

热门标签

归档