VB中遇到的问题
小弟初涉Visual Basic6.0,学习过程中发现如下问题计算某些数值的时候出错
比如建立一个form,一个commandbotton
执行以下代码:Private Sub Command1_Click()
Dim a As Double
a = 6000 * 6
End Sub
就会出错,报错为:实时错误'6',溢出。
但是我换成a=60000*0.6 就可以(难道6000*6不等于60000*0.6?)
1000*1000也出错,换成10000000*0.1就行,甚至1000^2就行
后来我尝试了一下5000*5可以,再往后7000*7,8000*8之类的就不行了,600*60也不行,还有很多都不行
我试了单位的和家里的电脑都这个问题,难道是我装的vb本身有问题(但是家里和单位安装的VB是不同的来源)?
恳请高人回答一下这个问题,万分感谢! --------------------编程问答--------------------
a = 6000 * 6--------------------编程问答-------------------- Double 型名义上可以存储&HFFFF但是实际存储的时候只能存储到&H7FFF,(前面会被认为是符号位) --------------------编程问答--------------------
===>
a = 6000& * 6
Private Sub Command1_Click()--------------------编程问答-------------------- 呵呵,这个问题很有趣;楼主先做个小测试:
Dim a As Double
Dim b As Double
b = 6000
a = b * 6000
Print a
End Sub
Private Sub Command1_Click()
Dim a%, i%
For i = 1 To 6000
a = 6 * i
Debug.Print a
Next
End Sub
'结果当i=5462的时候报overflow错误;此前a=32766
楼主可以查一下书,integer,long,double的上下限是多少就明白了
我觉得,根本的原因在于你直接把(6000 * 6)作为运算结果赋值给a之前,处理器有个类型自动转换的过程,但这个转换是隐式的,你看不见,摸不着;由于6和6000你都没通过声明变量引入到乘积运算,所以,系统默认其值为 integer 6 和integer 6000,那6*6000系统也默认为integer;而integer上限是32766,因此,超出之后就报错;
而当你把6该为0.6的时候,系统认为它是double,因此它认为0.6*60000也是doubl,这样就不报错而正常运行了.
--------------------编程问答-------------------- 记住,VB虽然能够自动类型转换,但是对表达式的结果总是先计算再转换的。 --------------------编程问答-------------------- Private Sub Command1_Click()
Dim a As Double
Dim b As Double
Dim c As Double
a = 6000
b = 6
c = a * b
End Sub
这样就不会错了
可能两个double 类型相乘了,所以会益出
--------------------编程问答-------------------- 會溢出?學習中。。。 --------------------编程问答-------------------- 4楼说得对 --------------------编程问答-------------------- 计算机中的类型是很严格的,不能用日常习惯去看它
6000*6和60000*0.6很明显不一样,类型就不一样嘛 --------------------编程问答-------------------- Private Sub Form_Click()
Dim i!, a!
For i = 1 To 6000
a = i * 6
Print a
Next
End Sub --------------------编程问答-------------------- 感谢大家的帮助,一时没想到integer型数值上限的问题
回9楼,我知道6000*6和60000*0.6数据类型不一样,问题在于我已经定义为double型
我觉得4楼的答案准确 --------------------编程问答-------------------- 唉,居然没一个答对的
是这样的:
a=6000*6
虽然你定义了A是双精度类型的,但是按照计算顺序等号的右面先计算,6000和6都再INTEGER类型的范围之内,所以也被VB默认为是INTEGER类型的,两者相乘的结果在被赋值给A之前是要存在一个临时变量内的,并且这个临时变量也因为两个乘数的关系而被VB定义为INTEGER类型的,INTEGER类型的范围是+-23767(是-23768到+32767还是反过来我忘记了)反正超过INTEGER了,因此就溢出了。
而当你写60000*6的时候,你也知道了,因为60000已经超过INTEGER了,VB的临时变量也就是LONG了,也就没问题了。
解决这个问题也很简单,这么写:
a=6000&*6 就可以了,
因为&在VB里就代表LONG类型,等于你在计算式里已经直接告诉了VB这个6000不是INTEGER而是LONG,VB也就不会想当然了。 --------------------编程问答-------------------- Private Sub Command1_Click()
Dim a As Double
a = 6000*6 #
End Sub
补充:VB , 基础类