****** 今天 VB6 怎么了??? ******

唐古拉山
博客专家认证
2006-06-15 10:48:53

在窗体上面加入 Command1,添加如下代码:

Private Sub Command1_Click()
Dim i As Long
i = (39 * 4) + (1024 * 40) '语句1
'i = 41116 '语句2
End Sub

'跑 语句1提示"溢出" ???
' 语句2却正常

...全文
1952 186 打赏 收藏 转发到动态 举报
写回复
用AI写文章
186 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangheyi01 2006-12-17
  • 打赏
  • 举报
回复
i = 39 * 4 + Val(1024) * 40
这样就可以!
paoluo 2006-07-18
  • 打赏
  • 举报
回复
哈,再看,還是想笑。
paoluo 2006-07-18
  • 打赏
  • 举报
回复
viena(维也纳nn木人 [IQ=50,EQ<0]) ,真是替你著急啊。

說了那麼多,居然得到的評價是,“也没有具体解释清楚为什么”。

唐古拉山 2006-06-27
  • 打赏
  • 举报
回复
总结完成了,0:30了,明天上午揭帖

VB版块也小小的热闹了一下啦,呵呵


唐古拉山 2006-06-27
  • 打赏
  • 举报
回复
我仔细分析了下,下面给出终结版的解释:

============================================================

VB6里面对于常数,如果没有带数据类型标志符或小数点,就认为是整数

而对于实际上是什么整数,则根据最小化原则:

我最初举的例子VB认为40和1024同为16位带符号整形,而数值计算结果的数据类型和操作数中表示范围最大的相一致
很明显40*1024的计算结果超出16位带符号整形的表示范围,VB6报溢出。
如果操作数中若有一个 Long 类型的,超过16位范围的,就默认采用32位计算了,所以不溢出.

这里,我强调一下:

(一)数据类型标志符
(二)数值计算结果的数据类型和操作数中表示范围最大的一个相一致

另外,VB表达式运算结果的数据类型向精度高的数据类型靠:

Integer<Long<Single<Double<Currency

(当然,没有精度高的就没的"靠"了,比如:40*1024 )

============================================================
还有就是:

VB6 VB.Net

Integer 16 位 Integer 32 位
Long 32 位 Long 64 位
True = -1  True = 1 

由于部分 .NET 框架技术以现代的 32 位和 64 位技术为基础,因此新技术更新了数据的表示大小

所以前面:northwolves(狼行天下)举的例子就是对着"数据类型标志符"的,这样VB就"认识"了真正的数值类型

============================================================

To of123 同志:
这位同志也没有解释个什么,就在瞎搅拌,也不知道这个四星星有没有才学...

To dfehqb(初学者)同志:
这位同志也很会攻击人,不会说理由

To aspower_(我知道楼下就欣赏偶的分) 同志:
这位同志也是饱含感情的发挥,VB6不能和某某比..不能比,拜托 vb比他们早生了将近10年
你也是来瞎混混了...

To viena(维也纳) 同志:
这位同志也算是以德服人了(爱VB的他差点要晕死了...)也没有具体解释清楚为什么,也不错啦
  这个三星星比上面那位还是多了点才学...呵呵
唐古拉山 2006-06-27
  • 打赏
  • 举报
回复
我仔细分析了下,下面给出终结版的解释:

===========================================================================

VB6里面对于常数,如果没有带数据类型标志符或小数点,就认为是整数

而对于实际上是什么整数,则根据最小化原则:

我最初举的例子VB认为40和1024同为16位带符号整形,而数值计算结果的数据类型和操作数中表示范围最大的相一致
很明显40*1024的计算结果超出16位带符号整形的表示范围,VB6报溢出。
如果操作数中若有一个 Long 类型的,超过16位范围的,就默认采用32位计算了,所以不溢出.

这里,我强调一下:

(一)数据类型标志符
(二)数值计算结果的数据类型和操作数中表示范围最大的一个相一致

另外,VB表达式运算结果的数据类型向精度高的数据类型靠:

Integer<Long<Single<Double<Currency

(当然,没有精度高的就没的"靠"了,比如:40*1024 )

===========================================================================
还有就是:

VB6 VB.Net

Integer 16 位 Integer 32 位
Long 32 位 Long 64 位
True = -1  True = 1 

由于部分 .NET 框架技术以现代的 32 位和 64 位技术为基础,因此新技术更新了数据的表示大小

所以前面:northwolves(狼行天下)举的例子就是对着"数据类型标志符"的,这样VB就"认识"了真正的数值类型

===========================================================================

To of123 同志:
这位同志也没有解释个什么,就在瞎搅拌,也不知道这个四星星有没有才学...

To dfehqb(初学者)同志:
这位同志也很会攻击人,不会说理由

To aspower_(我知道楼下就欣赏偶的分) 同志:
这位同志也是饱含感情的发挥,VB6不能和某某比..不能比,拜托 vb比他们早生了将近10年
你也是来瞎混混了...

To viena(维也纳) 同志:
这位同志也算是以德服人了(爱VB的他差点要晕死了...)也没有具体解释清楚为什么,也不错啦
  这个三星星比上面那位还是多了点才学...呵呵








唐古拉山 2006-06-27
  • 打赏
  • 举报
回复
我拿了一个不出问题的对比
而且反复说了是16位默认计算造成的问题
维也纳nn木人还是真的"木人"啊,我说了不要再讨论了
结果维也纳nn木人还要花心思举了个"溢出"的例子.......

你想说明什么呢?
大家都知道是怎么样回事了,你还是要这么"激动"?
有必要吗?

唐古拉山 2006-06-27
  • 打赏
  • 举报
回复
To of123() :

"我就是在瞎搅和。我觉得这个话题一点意思都没有。"
"我的确没有解释,因为我不屑。"

   ---基于这两点,那你还进来干什么?


唐古拉山 2006-06-27
  • 打赏
  • 举报
回复
To of123() :

  你也确实没有解释什么,我们已经解释和明白了为什么
  你还是要在这里提出"三个为什么?"
"我的确没有解释,因为我不屑。"....

建议of123同志看看你自己回复的帖子以及语气,相比维也纳,你这些回复简直就是瞎混混

  最后回复你的三个问题:

  1 VB 设计成按可容纳表达式中数字的最小缓冲区作缺省设置,应该是很聪明的。如果程序员预料到可能溢出,他应该负责强制数据类型的设置。
   答:微软默认16位,这是设计时的问题,当然,微软也可以采用32位,那更好

  2  不要轻易地怀疑别人的智慧(我不说智商,因为它还不包含许多更重要的东西),特别是写出这样优秀的供这么多人使用的软件的人的智慧。
   答:做人做事就要有怀疑的态度,这种习惯一切的思考方式不是明智的.很多时候,我们需要假设,这个假设可能是错误的,但是我们要敢于怀疑.

  3 如果我没猜错,楼主用的 VB 大概是 D 版吧。白吃了人家的,还骂人,而且骂得一点道理都没有。这样的人品,如果我是你的老板,真还不敢用你。
   答:估计of123同志幸福的用了VB的正版了,其实D版和正版无所谓,维也纳说的好,"对事不对人",of123同志现在已经能够把这事情对人了.
     呵呵,"如果我是你的老板,真还不敢用你。",还好你不是我的老板,哈哈,估计你也不会买正版的VB给我用了,由你的三个问题大概也知道你的人品如何了.




of123 2006-06-27
  • 打赏
  • 举报
回复
我就是在瞎搅和。我觉得这个话题一点意思都没有。明明表达式中每一个数字都可以自由地设置数据类型(缓冲区大小),还在这里喋喋不休。

我有没有才学无所谓,楼主的才学和德行是让人大开眼界。

开始是惊呼既然声明了被赋值的变量为何会溢出。继而在知道真相后恼羞成怒骂 SB。

我想问三个问题,楼主可以不回答。

1 VB 设计成按可容纳表达式中数字的最小缓冲区作缺省设置,应该是很聪明的。如果程序员预料到可能溢出,他应该负责强制数据类型的设置。

就算是按楼主的意思一律缺省设置成 32 位缓冲区,明天又一位醋博士后非要放一个更大的数字,然后骂超级 SB,又当如何?“128 位的数据类型不是早就有了吗?”

不要没了掩饰自己的无知,就“拉不出屎来赖茅房”地挑人家的毛病。

2 不要轻易地怀疑别人的智慧(我不说智商,因为它还不包含许多更重要的东西),特别是写出这样优秀的供这么多人使用的软件的人的智慧。

楼主说,是编译程序没有写好。那你写一个更好的出来。你写出过可以和 VB 同日而语的 Code 吗?据我的观察,骂很高级的东西 SB 的人,智力一般都在平均水平以下。至少是学识或见识不够。出了问题,多找自己的毛病;要学会赞赏别人,特别是真正好的东西。

3 如果我没猜错,楼主用的 VB 大概是 D 版吧。白吃了人家的,还骂人,而且骂得一点道理都没有。这样的人品,如果我是你的老板,真还不敢用你。

我的确没有解释,因为我不屑。
viena 2006-06-27
  • 打赏
  • 举报
回复
楼主明白就好了,
前面我有些回复有点讽刺挖苦的意思,
也是对事不对人,
在此道歉,
有得罪的地方,也请楼主见谅吧~
yhcxjnls 2006-06-27
  • 打赏
  • 举报
回复
是个好同志,以上的回贴比较客观.
唐古拉山 2006-06-27
  • 打赏
  • 举报
回复
再次说明:

我之前拿强烈对比的语言的例子等等都是没有用的
因为之前没有了解这一点,所以我也是瞎举了例子

提高了认识本身就是进步.

如果要再举例子,还可以举无数个例子的

维也纳你也不要生气了,你再举1000个也是一样,关键是要让大家知道究竟是为什么


唐古拉山 2006-06-27
  • 打赏
  • 举报
回复
To yhcxjnls(书生) & YaDa() :
这两位大概是起床太早了,匆匆看了下最后的几个回复就开始在这里发帖了
  你们两位大概还不明白我在说什么巴?

我现在已经解释了是因为默认16位计算造成的问题
  而且这默认也不是VB的SB

维也纳 同志确实解释了很多,但是他没有具体给出为什么微软要这样做
  他围绕的就是讲了一个不是让人很明白的理论和拿了几个溢出的另类

在我最后给出的解释里面已经很清楚了啊,维也纳同志也没有错!!!
最后,我再强调一下:

 (一)数据类型标志符
 (二)数值计算结果的数据类型和操作数中表示范围最大的一个相一致

前面大家的讨论有的是冲着感情而没有仔细思考,有的同志看到我说了VB的SB了就不看后面的帖子了,然后就直接回复,看帖子一定要看全啊

 我之前只是不知道上面这两点,所以确实是误会了MS VB 呵呵

知道了这点,也明白了为什么在Delphi、.Net 等其他编译器也有溢出了,这确实是没有办法的事情,只是我们要理解这个为什么.

 所以也不要再举任何的什么例子了,之前我举的也没有用,维也纳同志为了说服我也搞了一些举例,但是始终没有让我明白,但是现在一切已经明了,维也纳同志本身也说的是对的

 再就是建议那些看贴不仔细就直接回复的同志,你不要一开始就激动,要冷静的思考才行

 还有,右边表达式的计算和赋值确实是没有关系的!!!


viena 2006-06-27
  • 打赏
  • 举报
回复
楼主,
你能用到1024 * 40的运算,
我怎么就不能用到70000 * 70000的运算?

你能因为溢出抱怨VB6,
我怎么就不能因为同样的理由抱怨所有这些语言?

只可惜我没有一个可以拿来强烈对比的语言....
viena 2006-06-27
  • 打赏
  • 举报
回复
楼主,我举这个溢出的例子,只是告诉你,
你的例子的表达式的数只是无数个数里面的两个,
不能说明任何问题,
而我也随便举了一个例子,就没有
你说的什么强烈的对比

拿一个特殊的例子来以偏概全,
还得出某个结论,不能不说你的思维缺乏逻辑性~
YaDa 2006-06-27
  • 打赏
  • 举报
回复
tanaya(唐博士http://blog.csdn.net/tanaya) ( ) 信誉:100 2006-06-27 00:32:00 得分: 0


我拿了一个不出问题的对比
而且反复说了是16位默认计算造成的问题
维也纳nn木人还是真的"木人"啊,我说了不要再讨论了
结果维也纳nn木人还要花心思举了个"溢出"的例子.......

你想说明什么呢?
大家都知道是怎么样回事了,你还是要这么"激动"?
有必要吗?

有必要!如果看帖子的菜鸟也跟着认为“16位默认计算是VB的SB”不是害了看帖子的菜鸟了吗?


yhcxjnls 2006-06-27
  • 打赏
  • 举报
回复
别误会,上面的话是对唐博士说的.开始引用的是唐博士的话.
viena(维也纳) 同志是我所佩服的
yhcxjnls 2006-06-27
  • 打赏
  • 举报
回复
To viena(维也纳) 同志:
这位同志也算是以德服人了(爱VB的他差点要晕死了...)也没有具体解释清楚为什么,也不错啦
  这个三星星比上面那位还是多了点才学...呵呵
--------------------------
这就不客观了,他解释的比你的客观的多,也对大家有用的多.
而你我倒是觉得没解释什么,还有:总结还是让大家做吧.群众的眼睛是雪亮的.
我觉得ms把integer设计成16位的.是出于系统效率的考虑,因为很多比较小的数,没必要占用32空间,如果它大了,你用clng转换一下就行了,程序员不就是做这项工作的吗?
什么都替你考虑好了,那就是应用软件了.而不是设计软件了.
而且msdn对些有专门的说明,说明ms早就知道这个问题了,只是博士自已不知道,
博士亲口说的."老实说,以前没有碰到过这个问题,今天突然碰上的"
你那时可不是在讨论16位或32位的问题呀?
唐古拉山 2006-06-26
  • 打赏
  • 举报
回复
viena(维也纳nn木人)

请注意!问题的实质是《运算表达式本身是可能会溢出的,与赋值给什么变量无关》
而VB默认的整数是16位,不象其他语言那样默认是32位,是另外的问题,就算是设计缺陷吧,我并不否认 "

呵呵,我就说了个sb两个字,维也纳就很激动
其实,我也应该为说了"SB"这个词道歉,向MS道歉 呵呵
最初设计造成的问题麻 大家知道了就行了
就不要这样"追究"下去了
能用就行了,好用就行了



加载更多回复(166)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧