| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1260 人关注过本帖
标题:VB6中无意中发现奇怪现象,x=24*3600竟然报溢出错误!
只看楼主 加入收藏
tk72
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-11-28
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
VB6中无意中发现奇怪现象,x=24*3600竟然报溢出错误!
我要计算一天有几秒,随便写了个VB6代码,无意中发现一个奇怪现象:
Dim x As Long
x = 24*3600
这一步竟然报溢出错误。

但是,x= 24 * 33600,数字更大,但却不报错。
因为24*3600=86400,直接赋值 x=86400,也不报错

这样写也不报错:
Dim x,y As Long
x = 24
y = 3600
x = x * y

谁知道这是什么原因?难道VB里就是不允许24*3600?算不算bug?
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 tk72 于 2012-11-28 09:58 编辑 ]
搜索更多相关主题的帖子: 计算 
2012-11-28 09:51
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:20 
直接数,VB 规定,当直接属于某个范围时,就按 某个数进行存储。
如 24*3600
因为 24 和 3600 均小于 32767 ,所以均按 整数型 存储。
而在 24 * 33600 ,33600 大小 32767 ,是按 长整型 存储。

-----------------------
VB 表达式运算时,按各个存储数据的最高的数据等级 那一级来计算。
等级是:
双精度数》单精度数》长整数》整数
24*3600 中,两个数都是整数,所以按整数运算,结果也试图放入 整数 型,因为结果超过了 32767 ,所以报溢出。
24*33600 中,33600 超出整数,是长整型,所以按长整数运算,结果也试图放入 长整数 内,因为结果没有超过 2147483647 ,所以不报溢出。

-----------------------
24*3600 ,修改为 24&*3600 或 24*3600& 都可以。
数字后面带数据类型 表示符,是告诉 VB ,这个数按这种格式存储。

======================
VB 数值数据类型
     数值类型分为整数型和实数型两大类。
1、整数型
      整数型是指不带小数点和指数符号的数。
   按表示范围整数型分为:整型、长整型
(1)整型(Integer,类型符%)
        整型数在内存中占两个字节(16位)
        十进制整型数的取值范围:-32768 ~ +32767
例如:15,-345,654%都是整数型。而45678%则会发生溢出错误。
(2)长整型(Long,类型符&)
       长整数型在内存中占4个字节(32位)。
        十进制长整型数的取值范围:
-2147483648 ~ +2147483647
   例如:123456,45678&都是长整数型。
 
2、实数型(浮点数或实型数)
        实数型数据是指带有小数部分的数。
注意:数12和数12.0对计算机来说是不同的,前者是整数(占2个字节),后者是浮点数(占4个字节)
        实数型数据分为浮点数和定点数。
        浮点数由三部分组成:符号,指数和尾数。
        在VB中浮点数分为两种:
                   单精度浮点数( Single )
                   双精度浮点数( Double )
 
(1)单精度数(Single,类型符!)
      在内存中占4个字节(32位),,有效数字:7位十进制数
取值范围:负数 -3.402823E+38 ~ -1.401298E-45
                正数 1.401298E-45  ~  3.402823E+38
 

在计算机程序里面不能有上标下标的写法,所以乘幂采用的是一种称为科学计数法的表达方法
 
这里用E或者e表示10的次方(E/e大小写都可以)
比如:1.401298E-45表示1.401298的10的负45次方
                                         
vb里面可以这样表示:8.96E-5
例:21e5(正号省略)表示:
21乘以10的5次方的一个单精度数
 
 
(2) 双精度数(Double,类型符#)
        Double类型数据在内存中占用8个字节(64位)
        Double型可以精确到15或16位十进制数,即15或16位有效数字。
         取值范围:
       负数: –1.797693134862316D+308 ~ -4.94065D-324
       正数: 4.94065D-324 ~ 1.797693134862316D+308
比如17.88D5,表示它是一个双精度数,表示17.88乘以10的5次方
这里用D来表示10的次方


 二、 货币型(Currency,类型符@)
主要用来表示货币值,在内存中占8个字节(64位);
整数部分为15位,可以精确到小数点后4位,第五位四舍五入;属于定点实数
货币型数据的取值范围:
       -922337203685447. 5808 ~ 922337203685447. 5807
跟浮点数的区别:小数点后的位数是固定的,4位
例如:3.56@ 、 65.123456@都是货币型。
 
三、        字节型(Byte,无类型符)
 一般用于存储二进制数。
         字节型数据在内存中占1个字节(8位)。
         字节型数据的取值范围:0 ~ 255
 

四、   日期型(Date)
在内存中占用8个字节,以浮点数形式存储。
日期型数据的日期表示范围为:
         100年1月1日~9999年12月31日
日期型数据的时间表示范围为:
         00:00:00 ~ 23:59:59
       用#括起来放置日期和时间,允许用各种表示日期和时间的格式。
       日期可以用“/”、“,”、“-”分隔开,可以是年、月、日,也可以是月、日、年的顺序。时间必须用“:”分隔,顺序是:时、分、秒。
 
例:
#09/10/2000#    #2000-09-12#   
#08:30:00 AM#  
#09/10/2000 08:30:00 AM#
 
例:
Dim mylab As Date
mylab = #9/3/2001 11:35:00 AM#
Time = mylab
 
在VB中会自动转换成mm/dd/yy(月/日/年)的形式。
 
五、  逻辑型(Boolean)
     逻辑型数据在内存中占2个字节。
     逻辑型数据只有两个可能的值:
            True(真)      False(假)
     若将逻辑型数据转换成数值型,则:
            True(真)为 –1        False(假)为  0
    当数值型数据转换为Boolean型数据时:
            非0的数据转换为true,0为fasle。
 
六、字符串( String  ,类型符$)
       字符串是一个字符序列,必须用双引号括起来
说明:
 双引号为分界符,输入和输出时并不显示。
 字符串中包含字符的个数称为字符串长度。
         长度为零的字符串称为空字符串,比如“”,引号里面没有任何内容
字符串中包含的字符区分大小写。
 字符串可分为变长字符串和定长字符串两种。   
 
(1).变长字符串(长度为字符串长度)
例:dim a as string   
a="123"    a="456789“
(2).定长字符串(长度为规定长度)
对于定长字符串,当字符长度低于规定长度,即用空格填满,当字符长度多于规定长度,则截去多余的字符。
例:dim a as string * 10
 
 
七、对象数据类型(Object )
     对象型数据在内存中占用4个字节。用以引用应用程序中的对象。
八、变体数据类型(Variant )
    变体数据类型是一种特殊数据类型,具有很大的灵活性,可以表示多种数据类型,其最终的类型由赋予它的值来确定。
 
九、用户自定义类型
如果我想同时记录一个学生的学号、姓名、性别、总分,那么我可以用自定义类型。
用户自定义类型特点:这种类型的数据由若干个不同类型的基本数据组成。
自定义类型由Type语句来实现:
格式:Type  自定义类型名                          
            元素名1  As 类型名
            元素名2  As 类型名
            ……
      元素名n  As 类型名
       End Type
Type是语句定义符,告诉VB现在要定义一个数据类型,是vb的关键字;其后的自定义类型名是要定义的该数据类型的名称,由用户确定;end type表示类型定义结束;自定义类型名是组成该数据类型的变量的名称
例:
Type Student
  Num As Long   ‘学号
  Name As String*10   ‘姓名,用长度为10的定长字符串来存储
  Sex As String*5   ‘性别,用长度为5的定长字符串来存储
  Score As Single  ‘得分,用单精度数来存储
End Type
一般在标准模块里面定义,如果只想在窗体里面定义,则前面必须加上Private,表示该类型只对本窗体有效,其他窗体无法定义该类型的变量。
定义了Student类型之后,我们就可以定义Student类型的变量了,比如: Dim Stu As Student
我们可以像引用对象的属性那样引用类型的各个成员:
比如:Stu.Num   Stu.Name  Stu.Sex   Stu.Sex  Stu.Score

------------------------------

授人于鱼,不如授人于渔
早已停用QQ了
2012-11-28 10:46
tk72
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-11-28
收藏
得分:0 
谢谢斑竹详细解释
2012-11-28 11:55
快速回复:VB6中无意中发现奇怪现象,x=24*3600竟然报溢出错误!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033888 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved