求助:很简单的关于long型VB溢出的问题。。。
不好意思,分用完了。。还请大家帮帮忙啊。。求助:代码如下:PrivateSubCommand1_Click()DimeAsLonge=4000*10Text1.Text=...
不好意思,分用完了。。还请大家帮帮忙啊。。
求助:代码如下:
Private Sub Command1_Click()
Dim e As Long
e =4000 * 10
Text1.Text = e
End Sub
运行显示“实时错误6,溢出”
但是直接e=40000就通过。
为什么呢? 展开
求助:代码如下:
Private Sub Command1_Click()
Dim e As Long
e =4000 * 10
Text1.Text = e
End Sub
运行显示“实时错误6,溢出”
但是直接e=40000就通过。
为什么呢? 展开
展开全部
是这样的:VB在进行四则运算前,会先根据参与运算的各个数值的类型来预先决定用什么类型的数值来保存运算结果(注意这跟运算结果赋值给什么类型的变量是没有关系的,因为上述过程发生在赋值前),而4000和10都是整型数(Integer),所以VB就自作聪明地按整型运算的方式来处理运算结果,但是实际运算结果40000已经大于32767(Integer允许的最大值),所以就很悲催地出现“溢出”的错误了。
你试试下面两个语句就什么都清楚了:
e = 32767 * 10 '出错,因为32767是Integer型,但运算结果却是Long型
e = 32768 * 10 '不出错,因为32768是Long型,而运算结果也是Long型
说不上这是VB的Bug,因为其实VB是故意这么做的!原因也很简单,这样做可以节省内存资源以及提高运算速度,这在进行大量的小数据运算(运算结果小于32768的整数运算)时是有非常明显的效果的。
要想避免这种错误,你可以强制设定参与运算的某个数为Long型即可(只需一个数即可),比如:
e = 4000& * 10
e = 4000 * 10&
e = CLng(4000) * 10
好了,讲课完毕,下面布置家庭作业,在不上机测试的情况下说出下面四条语句那条会出错:
e = 32767 + 10
e = 32767 - 10
e = 32767 * 10
e = 32767 / 10
你试试下面两个语句就什么都清楚了:
e = 32767 * 10 '出错,因为32767是Integer型,但运算结果却是Long型
e = 32768 * 10 '不出错,因为32768是Long型,而运算结果也是Long型
说不上这是VB的Bug,因为其实VB是故意这么做的!原因也很简单,这样做可以节省内存资源以及提高运算速度,这在进行大量的小数据运算(运算结果小于32768的整数运算)时是有非常明显的效果的。
要想避免这种错误,你可以强制设定参与运算的某个数为Long型即可(只需一个数即可),比如:
e = 4000& * 10
e = 4000 * 10&
e = CLng(4000) * 10
好了,讲课完毕,下面布置家庭作业,在不上机测试的情况下说出下面四条语句那条会出错:
e = 32767 + 10
e = 32767 - 10
e = 32767 * 10
e = 32767 / 10
展开全部
e=4000*10中,VB默认4000和10认为是二个整数,40000超过了整数的值域,所以报溢出
直接赋值e=40000则是让VB默认40000为长整数,所以没有问题
你可以修改e=4000& *10& 进行隐式声明,告诉VB这是二个长整数就不会报溢出错误啦
直接赋值e=40000则是让VB默认40000为长整数,所以没有问题
你可以修改e=4000& *10& 进行隐式声明,告诉VB这是二个长整数就不会报溢出错误啦
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
估计是VB的一个bug,在赋值的时候,尽量不要用4000~到10000左右的值乘以10来赋值,会报溢出的错误。直接赋值一个亿都正常。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
初步判断,这是VB的一个BUG。
经测试
4000*10会报错,但40000*10就能正确计算。
使用 CLng(4000) * 10,进行强制转换,可以解决。
经测试
4000*10会报错,但40000*10就能正确计算。
使用 CLng(4000) * 10,进行强制转换,可以解决。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
发短信更多的方法方法发发发发发发发发发发发发发
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询