关于vb中数据的溢出问题

为什么计算Private Sub Form_Click()Dim a As Longa = 16384 * 4 * 0.5Print aEnd Sub溢出,发生错误而计算Private Sub Form_Click()Dim a As Longa = 4 * 0.5 * 16384 Print aEnd Sub时就可以算出来而Private Sub Form_Click()Dim a As Long 或 Dim a As double 或 Dim a As singlea = 16384 * 2 或 a = 2*16384 Print aEnd Sub都发生溢出的错误
为什么计算
Private Sub Form_Click()
Dim a As Longa = 16384 * 4 * 0.5
Print a
End Sub
溢出,发生错误

而计算
Private Sub Form_Click()
Dim a As Longa = 4 * 0.5 * 16384
Print a
End Sub
时就可以算出来


Private Sub Form_Click()
Dim a As Long 或 Dim a As double 或 Dim a As single
a = 16384 * 2 或 a = 2*16384
Print a
End Sub
都发生溢出的错误

VB进行加减乘除四则运算时,会根据第一步运算时的位数来决定最终结果的存储位数。这个跟最终赋值的那个变量是什么类型是无关的,因为这是发生在运算过程中(也就是赋值之前)的。
所以
16384 * 4 * 0.5
由于16384是Integer,所以VB会先假定运算结果也是Integer,因此它就分配两个字节的内存空间来存储运算结果,然后它开始运算16384 * 4,结果为65536,超出Integer的范围了,它就立刻报“溢出”,后面的也不再计算了。16384 * 2 和 2*16384 也是同样的道理,都是因为计算结果超出Integer范围所以提示“溢出”。
4 * 0.5 * 16384
同样4也是Integer,所以VB也是预定了两个字节的“座位”恭候运算结果。但是,当运算到4 * 0.5时,由于涉及到浮点运算了,所以VB就自动把运算结果的类型调整为Double,也就是说“座位”一下子扩大为8个字节了,后面再怎么运算也不会溢出了。

要想让 16384 * 4 * 0.5 不会出现溢出的错误,可以这样:
16384& * 4 * 0.5 '把16384强制指定为Long型(4个字节),这样再计算就不会溢出了

16384 * 4.0 * 0.5 '别以为4和4.0是一样的哦,前者是整数,后者可是浮点数哦。当然VB会自动把4.0改为4#,意思就是Double
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-09-16

溢出(错误 6):

当赋值超出目标的限制时,就会发生溢出。此错误有以下的原因和解决方法:

*赋值、计算或数据类型的结果的转换太大,以致于不能在变量类型所允许的范围内表示出来。

赋值给足够表示值的范围的类型的变量上。

*给属性的赋值超过属性能接受的最大值。

确保赋值适合属性的范围。

*试图在计算中使用一个数字,并且该数字被强制为一个整数,但是结果超过了整数的范围,例如:

   Dim x As Long
    x = 2000 * 365   ' 错误: 溢出

要解决这个问题,请按如下方式键入该数字:

    Dim x As Long
    x = CLng(2000) * 365

详细信息,可选取有问题的项目,并按下 F1 键查看帮助。

第2个回答  2012-10-10
这个16384 * 4 * 0.5,他是先计算16384 * 4 = 65536,就溢出了。而4 * 0.5 * 16384,先计算4 * 0.5 = 2,再 2 * 16384,不会溢。
第3个回答  2012-10-10
计算过程的中间结果超出数据类型值域。
第4个回答  2012-10-10
正解:
在VB中的常数,如果尾巴没带类型定义符,若不含小数点就默认为Integer类型,范围为[-32768,32767],若含小数点就默认为single类型。
Dim a As Long
a = 16384 * 4 * 0.5会产生溢出,因为16384是Integer类型,系统会开辟一个临时内存空间(2字节),用于存放16384,然后*4,将结果65536仍放回到这个临时存储空间,此时超出范围!
a = 4 * 0.5 * 16384不会溢出,因为4是Integer类型,而0.5是single类型,这两种类型的运算结果会自动选择为范围更大的single类型,因此*0.5后为2.0,这个2.0是single类型,2.0*16384=32768.0,仍为single类型,不超single类型的范围;关键是0.5起了扩展范围的作用!
Dim a As Long 或 Dim a As double 或 Dim a As single
a = 16384 * 2 或 a = 2*16384会产生溢出,因为16384是Integer类型,系统会开辟一个临时内存空间(2字节),用于存放16384,然后*2,将结果32768仍放回到这个临时存储空间,此数超出范围!
那么,我既然定义了a是Long 、 double 或 single类型,为什么仍超界?!你定义的变量,只是告诉系统,在内存中开辟一块,用于存放数据,可是a的值要先计算表达式才能得到,是在计算过程中出了界,而不是存储的问题。你可以直接写作a=32768,不会出错。也可以强行约定整数的范围,如:a=16384& * 2,或者a=2& *16384,或者把"&"(强制为Long类型)换成"!"(强制为single类型)或"#"(强制为double类型)