当前位置:编程学习 > VB >>

求VB中溢出原理。。。

Private Sub Command1_Click() Dim k As Long k = 10000 * 4 Print k End Sub 这运行溢出 Private Sub Command1_Click() Dim k As Long k = 40000 * 1 Print k End Sub 没有溢出 这是为什么?最好能解释溢出形成的本质原因
答案:Dim x asLong

x=33*1000  '产生溢出错误


...然而当我直接赋值x=330000时,就正常运行没有错误.
答:在计算赋给X的值时,VB会使用一个临时变量.在此过程中,它使用的是一个与表达式中数据类型相同的临时变量.在上面的例子中,由于相乘的两个数都为整型(Integer),VB将使用一个整型的临时变量.当乘积超过32K(整型的极限)时,就会产生溢出错误.修正的方法是给表达式中的某个值指定一个类型标识符,强制VB使用一个足以容纳计算结果的临时变量.如:
x=33*1000&
尽管1000不是Long型数,但VB将使用一个Long型临时变量来保存结果.然而,还要注意这段代码:
x=33*1000*100&
由于VB试图将表达式前一部分的积赋给一整型临时变量,将仍然会发生溢出错误,尽管在表达式中已经声明了一个Long型数.修正的方法是把最大的数声明为Long或者是把VB将计算为Long型的数用括号括起来:
x=33*1000&*100
x=33*(1000*100&)->

看了这个你就知道了 
VB对缺省的临时变量类型,一般默认为第一个数值类型,


Private Sub Command1_Click()
Dim k As Long
k = 10000 * 4   '10000为integer型,结果40000超出了integer范围,显示溢出
Print k
End Sub
这运行溢出
Private Sub Command1_Click()
Dim k As Long
k = 40000 * 1     '40000为long型,结果40000还是long型,不溢出
Print k
End Sub
其他:
我也遇到过:
Dim a As Byte, b As Integer, c As Integer
a = 20
b = 20
c = a * b     '没事
c = a ^ 2     '没事
c = 32767 * b     '溢出
c = a * a     '溢出
---------
原因应该是这样:
每个运算符都有自己默认的 运算结果 的 数据类型,
每次运算前,系统会开一个存放结果的内存空间,而这个空间的大小,与参与计算的变量类型、运算符号有关系,找到了 ^和* 的说明,能看出^的结果通常是Double,*的结果就是参与计算变量中,范围最大那个变量的范围
--------
^运算符:
语法:result = number^exponent
说明:result 的数据类型通常是 Double 或包含 Double 的 Variant。 
*运算符:
语法:result = number1*number2
说明:result 的数据类型通常与最精确的表达式的数据类型相同。 
---------
仔细总结了下,到我的空间看吧:
 VB在接受数字算式时,总是有最省内存的临时变量去盛这些数的。比如计算10000 * 4,VB先用一个integer型的临时变量(也就是栈)盛10000(因为10000最省内存的类型就是integer),再用这个临时变量去*4,结果仍然放在这个类型的变量中,结果为40000,面这种类型最大只能为32767,因此溢出。同理在计算40000 * 1时,VB先用一个long型临时变量盛40000(40000已超过integer的范围),再计算,将结果仍然放在同样类型的变量中,因此不会溢出。 

上一个:请教:在窗体上每隔500毫秒显示三种颜色(红、绿、黄)之一,用vb怎样写?
下一个:一个关于VB的小问题

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,