2014-10-16 116 views
32

我经常遇到Overflow错误有关的问题。为什么使用整数而不是长整数?

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

除非您在for循环中执行操作,您可以保证该值不会超过32,767的限制,否则会对性能或其他指令不会影响long

+3

你问自己为什么存在不同的(* numeric *)数据类型? – 2014-10-16 17:04:37

回答

83

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

msdn

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

msdn

所以,好处是减少了内存空间。整数占用了长时间内存的一半。现在,我们正在谈论2个字节,所以除非存储整数的TON,否则它不会产生真正的变化。

BUT一个位系统上,一个16位整数被默默地转换为长而不较大数字范围一起工作的益处。溢出仍然会发生,并且需要尽可能多的内存。 Performance may even be hurt,因为数据类型必须转换(在很低的级别)。

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

我的理解是,即使它作为一个整数声明的基本VB引擎将整数长。因此可以注意到速度的轻微下降。我已经相信了一段时间,也许这也是为什么上面的说法被提出,我没有要求推理。

ozgrid forums

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

简短回答,在32位系统中2个字节的整数被转换为4个字节 长。实际上没有其他办法,以便各个位正确地排列为 以用于任何形式的处理。考虑以下

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

显然-1不等于65535尚未但是我们已经裹挟-1到长计算机返回正确的答案 ,即 “FFFF” =“FFFF”

首先我们会得到正确的答案 (65535是大于32K自动长)

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

“FFFFFFFF”= “FFFF”

通常,VBA没有必要在现代 系统中声明“As Integer”,除了可能希望接收整数的某些传统API。

pcreview forum

而且终于我发现msdn documentation我是真的真的找。

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

因此,总而言之,现在几乎没有理由使用Integer类型。 除非您需要Interop与旧的API调用,需要一个16位整数。

值得指出的一件事是,一些旧的API函数可能期望参数是16位(2字节)整数,如果你在32位并尝试传递一个整数(已经是长度为4个字节),由于字节长度的不同,它不能工作。

感谢Vba4All指出。

+4

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

+2

@这是一种我很不明白的乐趣。如果通过引用传递一个Long来引用一个要求Integer的函数,它将使用前两个字节,并且由于数字存储在little-endian中,它将起作用(假设只有两个较低字节是有意义的,但如果这个Long只是一个以32位存储的整数)。 – 2015-04-26 07:16:22

+2

另一次你*必须使用'Integer'的时候是声明'Type'的时候,类型的布局和大小很重要,要么是因为你要将类型传递给API,要么是序列化/反序列化文件,或者您正在使用'LSet' /'Rset'复制字节。 – ThunderFrame 2017-04-09 20:01:47

-6

也许一个CS毕业生可以更好地解释它,但是是一个整数需要较少的内存来存储(可能不是一个非常简单的VBA脚本相关)。

它还保证/验证该变量将始终是一个整数(非十进制)。我相当确定,如果将6.7存储为整数,它将在VBA中转换为数字7。

这可能不是最佳做法,但可能会出现这种情况。我认为主要目的是数据验证/完整性。特别是,对于需要发生某些事情的循环而言,是的。X次数 - 小数点无效。

主要的区别是内存虽然 - 如果我记得长是64位和整数是32位。

+2

这就是.Net存储空间,而不是VBA。 – RubberDuck 2014-10-16 16:31:53

7

VBA有很多历史包袱。

Integer是16位宽,当16位体系结构/字大小流行时,它是一个很好的默认数字类型。

A Long是32位宽,应尽可能使用(IMO)。

9

正如在其他答案中指出的,int和long之间的真正区别是它的内存空间的大小,因此它可以容纳的数量的大小。

这里是这些数据类型 http://msdn.microsoft.com/en-us/library/office/ms474284(v=office.14).aspx

一个整数是16位,并且可以表示的值-32,768和32,768 之间

一个是32位,并且可以表示完整的文档 - 2,147,483,648到2,147,483,648

并且有一个LongLong它是64位,可以像9 pentilion处理

要记住的最重要的事情之一是数据类型因语言和操作系统/平台而不同。在你的VBA世界中,长度为32位,但在64位处理器上的c#中,长度为64位。这可能引起重大混乱。

虽然VBA没有对它的支持,当你移动到任何其他语言在.NET或Java或其他,我更喜欢使用的INT16系统数据类型,INT32Int64的允许我可以更加透明地了解这些数据类型中可以保存的值。

4

这是一个空间 vs 必要性问题。

在某些情况下,这是一个必要性使用长。如果你在一个大的Excel文件中遍历行,那么包含行号的变量应该是一个很长的行。

但是,有时您会知道整数可以处理您的问题,并且使用long会浪费空间(内存)。个别变量实际上并没有太大区别,但是当你开始处理数组时,它可能会产生很大的变化。

  • 在VBA7,整数是2个字节,多头被4个字节

  • 如果有100万个的数字1和10之间的阵列,使用整数数组将占用 2MB RAM,而长阵列大约有4MB的RAM。

+0

对于1到10之间的数字数组,您可以改为使用BYTE数组,但我理解您正在创建的点。 – ChrisB 2017-08-31 16:51:04

相关问题