为什么使用整数而不是长整型?

2023-11-26

我经常看到有关的问题Overflow错误与vba.

我的问题是为什么使用integer变量声明而不是仅仅定义所有数值变量(不包括double等)作为long?

除非您正在执行类似 for 循环的操作,您可以保证该值不会超过 32,767 限制,否则是否会对性能产生影响或导致不使用long?


整数变量存储为 16 位(2 字节)数字

Office VBA 参考

Long(长整数)变量存储为带符号的 32 位(4 字节)数字

Office VBA 参考

因此,好处是减少了内存空间。 Integer 占用的内存是 Long 的一半。现在,我们讨论的是 2 个字节,因此它不会对单个整数产生真正的影响,只有在处理大量整数(例如大型数组)并且内存使用至关重要时才需要考虑。

BUT on a 32位系统中,内存使用量减半是以性能为代价的。当处理器实际使用 16 位整数执行某些计算时(例如,递增循环计数器),该值会默默地转换为临时 Long,而没有使用更大范围的数字的好处。溢出仍然会发生,并且处理器用于存储计算值的寄存器将占用相同数量的内存(32 位)。性能甚至可能是hurt因为必须转换数据类型(在非常低的级别)。

不是我正在寻找的参考,但是......

我的理解是,底层 VB 引擎会将整数转换为 long,即使它声明为整数。因此,可以注意到速度略有下降。我已经相信这一点有一段时间了,也许这也是我发表上述言论的原因,我并没有要求推理。

ozgrid 论坛

这是我一直在寻找的参考。

简短回答,在 32 位系统中,2 字节整数转换为 4 字节 长。确实没有其他方法可以使各个位正确排列 适合任何形式的处理。考虑以下

MsgBox Hex(-1) = Hex(65535) ' = True

显然 -1 不等于 65535 但计算机返回正确的值 回答,即 “FFFF”=“FFFF”

然而,如果我们将 -1 强制为长第一个,我们就会得到正确的结果 答案(大于 32k 的 65535 自动为 long)

MsgBox Hex(-1&) = Hex(65535) ' = False

“FFFFFFFF”=“FFFF”

一般来说,在现代 VBA 中声明“As Integer”是没有意义的 系统,也许除了一些期望接收 整数。

pcreview论坛

终于我找到了msdn文档我真的很认真地在寻找。

传统上,VBA 程序员使用整数来保存小数 数字,因为它们需要更少的内存。在最近的版本中, 但是,VBA 会将所有整数值转换为 Long 类型,即使它们是 声明为 Integer 类型。所以不再有性能优势 使用整数变量;事实上,Long 变量可能会稍微 更快,因为 VBA 不必转换它们。

To clarify based on the comments: Integers still require less memory to store - a large array of integers will need significantly less RAM than a Long array with the same dimensions (almost exactly half as much, which you can check for yourself in Task Manager). But because the processor needs to work with 32 bit chunks of memory, VBA converts Integers to Longs temporarily when it performs calculations


因此,总而言之,几乎没有充分的理由使用Integer这几天打字。Unless您需要与需要 16 位 int 的旧 API 调用进行互操作,或者您正在使用由小整数组成的大型数组,并且内存非常宝贵。

值得指出的一件事是,一些旧的 API 函数可能需要 16 位(2 字节)整数的参数,并且如果您使用 32 位并尝试传递整数(已经是 4 字节长)通过引用,由于字节长度的差异,它将不起作用。

感谢 Vba4All 指出了这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用整数而不是长整型? 的相关文章

  • 在没有加载项的情况下加载 Excel

    All 我编写了一个电子表格应用程序 用户通过双击我提供的图标来加载它 问题是用户有很多插件 这会降低 Excel 的速度 如何使用命令行开关加载 Excel 来禁用所有加载项 该问题适用于 Excel 2003 和 Excel 2007
  • 解析未完全加载 VBA 的网站

    尝试进行简单的网络解析 我的问题是页面在向下滚动之前无法完全加载 谷歌搜索已经提出可能使用硒 但由于我不知道如何使用它 我想我会在这里问 我使用的代码 Sub gfquote Dim oHttp As MSXML2 XMLHTTP Dim
  • Java - 将无符号十六进制字符串解析为有符号长整型

    我有一堆十六进制字符串 其中之一是 d1bc4f7154ac9edb 这是 3333702275990511909 的十六进制值 如果执行 Long toHexString d1bc4f7154ac9edb 这与您得到的十六进制相同 现在
  • 反转 Python 整数的位

    给定一个十进制整数 例如 65 如何反转 Python 中的底层位 即以下操作 65 01000001 10000010 130 看来这个任务可以分为三步 将十进制整数转换为二进制表示形式 反转位 转换回十进制 第 2 步和第 3 步看起来
  • 您可以调整用户窗体的这些代码吗:使其小而高效

    当 userfrom 按以下顺序激活时 我想在运行时添加动态用户表单控件 例如 标签 文本框 我想要类似以下的东西 当用户表单激活时 它需要询问用户字段的数量 他 她想要插入 如果用户回答7 则需要按以下顺序添加字段 3 列顺序 标签1 文
  • Excel VBA:排序,然后复制和粘贴

    所有 我需要编写一个执行以下操作的宏 将数据输入到 E 列的最后一个空白单元格后 按 E 列对整个工作表进行降序排序 工作表排序后 2a 将单元格复制到紧邻首次输入数据的单元格左侧的相邻单元格 2b 将复制的数据粘贴到最初输入数据的同一行的
  • 如果一个数字写在方括号中,例如[5],这意味着什么

    我正在开发一个旧版 VBA Excel 应用程序 并偶然发现了一些代码行 其中长字符串 从文件中读取 被切成碎片 这些行看起来像这样 Range E16 Value Mid line 49 6 显然 写 6 意味着需要 6 个字符 但我从未
  • 当存储在集合中时,如何更改类属性的值

    我想将一个类存储在集合中 并且能够更改该类的属性 而不必删除集合项并再次将其添加回来 我的研究表明 如果不进行删除 替换操作 则无法更改项目本身 但是项目的属性又如何呢 下面的代码展示了如何执行此操作 当您运行宏时 调试窗口将显示存储对象的
  • 消除多个 Elseif 语句

    我试图保持我的代码干净 特别是在用户表单中使用组合框 可能会有很多 if Elseif 语句 应该有一种更简单的方法 让一个组合框不再需要多页代码 是吗 现在如何完成的示例 Sub Example Dim Variable as Strin
  • 正在使用的 VBA 监视文件

    我正在寻找一些东西 Win API 调用或其他 来在文件可供编辑 即不再使用 时通知我 我应该设置一个计时器来按一定时间间隔检查文件还是有一个好方法对文件设置监视 FileSystemWatcher 没有帮助 Win32 FindFirst
  • 如何在Python中不使用库函数将字符串转换为整数?

    我正在尝试转换 a 546 to a 546 不使用任何库函数 我能想到的 最纯粹 gt gt gt a 546 gt gt gt result 0 gt gt gt for digit in a result 10 for d in 01
  • 在Excel中显示毫秒

    我正在尝试在 Excel 宏中显示毫秒 我有一列整数 它们是以毫秒为单位的时间戳 例如 28095200 是上午 7 48 15 200 我想在它旁边创建一个新列 以保持运行平均值并以hh mm ss 000格式 Dim Cel As Ra
  • Excel,循环遍历 XLSM 文件并将行复制到另一个工作表

    我现在遇到的此代码的主要问题是处理我打开的 xlsm 文件的错误 我对这些文件的 VB 代码没有编辑权限 如果 vb 出错 有没有办法跳过文件 我有一个包含大约 99 个 xlsm 文件的文件夹 我希望循环遍历每个文件并复制每个工作簿中的第
  • 如何锁定特定单元格但允许过滤和排序

    我使用以下代码来锁定某些单元格的内容 Sub LockCell ws As Worksheet strCellRng As String With ws Unprotect Cells Locked False Range strCellR
  • 如何根据文本框值过滤列表框值

    我在用户窗体上有一个文本框和一个列表框 我想根据我在文本框中输入的值过滤列表框中的值 名为 TMP 的工作表具有值 我根据文本框更改事件对其进行过滤 但在将该值添加到列表框中时它 会自动退出 Private Sub Textbox1 Cha
  • 自动计算Excel VBA UDF与单元格属性相关

    我编写了一个 UDF 来计算特定颜色和特定线条样式的单元格 我发布了整个函数 Function CountTime rData As Range cellRefColor As Range As Variant Dim indRefColo
  • 使用 Excel 2010 通过存储过程读取/写入 SQL Server 2008 数据库

    我们有一个 SQL Server 2008 数据库 它有存储过程来处理读 写等 这些过程由各种应用程序内部使用 需要一个人直接更新数据库中名为 Employee 的表 更新非常简单 更新 VARCHAR 和 INT 外键 字段 问题是 Sh
  • 在 Excel VBA 中,如何访问存储在已安装的加载项中的子项?

    我已经创建了一个 Excel 加载项 该加载项中有一些模块 假设 module1 是其中之一 在 module1 中 我有一个 sub 声明为 public sub abc end sub 在我的工作簿中 我希望能够使用外接程序中定义的函数
  • 如何连接以逗号分隔的命名范围的返回值

    我花了几个小时试图找出如何连接命名范围中的返回值 但结果是 运行时错误 32 类型不匹配 作为一个新手 我仍在与数组作斗争 所以也许我忽略了一些细节 谢谢你帮助我 示例 B1 苯 B2 柴油 B3 混合动力 gt E1 汽油 E2 柴油 E
  • VBA Excel 选择以字符开头的命名范围

    我在命名范围方面遇到了一些问题 我在不同的工作表上有多个命名范围 我想用VBA隐藏或显示所有这些范围 命名范围的示例 r1 name1 另一张纸上的第二个是r1 name2 因此 所有范围都以前面相同的代码开头 r1 我如何循环遍历以 r1

随机推荐