VB语言关于long长整型溢出的问题
答案:2 悬赏:10 手机版
解决时间 2021-12-01 02:59
- 提问者网友:椧運幽默
- 2021-11-30 15:46
VB语言关于long长整型溢出的问题
最佳答案
- 五星知识达人网友:低血压的长颈鹿
- 2021-11-30 16:07
32*1024=Overflow(溢出)?
●32×1024为什么不是32768而是Overflow(溢出)这个结果?这个问题要从资料形态开始讲起,当我们设定一个变量为整数时,程序会向作业
系统要求2Byte(32bits)来存放资料,其可存放的范围为-32768 ~ +32767(在VB时),当数值超过这个范围时,因内存空间已固定为2Byte,无
法法再增加,在C语言里只取2Byte,而VB会造成溢出现象而停止程序执行。
例如:
Private Sub command1_Click()
Dim A As Integer
A = 32768
End Sub
●结果执行时会溢出
Private Sub command1_Click()
Dim B As Integer
A = -32769
End Sub
●结果执行时会溢出
Private Sub command1_Click()
Dim C As Long
C = 32 * 1024
End Sub
●结果会如何?答案依然是溢出。因为VB在做数值运算时,会先开一个内存地址来存放计算结果,然后在传送到你指定的变量里,如上一个程
序,变量C虽然是长整数,其可存放数值范围为-2,147,483,648 ~ +2,147,483,647,但VB作计算时,将32判断成整数,1024 也判断成整数,
就任意在某个位置的内存上开启 2Byte大小来存放32×1024的值再回存至变量C,但32×1024已超过任意在某个地址的内存2Byte的大小,故溢
出。
●同理,C = -32768 - 1与 C = 32767 + 1 都也会溢出。
Private Sub command1_Click()
Dim C As Long
C = 32 * 32768
End Sub
●结果会如何?答案是1048576。为什么计算又变正常呢,因为VB在做此数值运算时,将32判断为整数,因为32768超过整数的范围,因为判断
成长整数,就任意在某个位址的内存上开启 4Byte大小来存放32×1024的值再回存至变量C,因此32×32768可以正常计算。
●怎么解决溢出问题呢?答案就是转换变量的类型,如下:
Private Sub command1_Click()
Dim D As Long
D = CDec(32) * CDec(1024) '转成十进制
D = CDec(-32768) - CDec(1) '转成十进制
D = CLng(32) * CLng(1024) '转成工整数
D = CLng(32767) + CLng(1) '转成长整数
End Sub
●32×1024为什么不是32768而是Overflow(溢出)这个结果?这个问题要从资料形态开始讲起,当我们设定一个变量为整数时,程序会向作业
系统要求2Byte(32bits)来存放资料,其可存放的范围为-32768 ~ +32767(在VB时),当数值超过这个范围时,因内存空间已固定为2Byte,无
法法再增加,在C语言里只取2Byte,而VB会造成溢出现象而停止程序执行。
例如:
Private Sub command1_Click()
Dim A As Integer
A = 32768
End Sub
●结果执行时会溢出
Private Sub command1_Click()
Dim B As Integer
A = -32769
End Sub
●结果执行时会溢出
Private Sub command1_Click()
Dim C As Long
C = 32 * 1024
End Sub
●结果会如何?答案依然是溢出。因为VB在做数值运算时,会先开一个内存地址来存放计算结果,然后在传送到你指定的变量里,如上一个程
序,变量C虽然是长整数,其可存放数值范围为-2,147,483,648 ~ +2,147,483,647,但VB作计算时,将32判断成整数,1024 也判断成整数,
就任意在某个位置的内存上开启 2Byte大小来存放32×1024的值再回存至变量C,但32×1024已超过任意在某个地址的内存2Byte的大小,故溢
出。
●同理,C = -32768 - 1与 C = 32767 + 1 都也会溢出。
Private Sub command1_Click()
Dim C As Long
C = 32 * 32768
End Sub
●结果会如何?答案是1048576。为什么计算又变正常呢,因为VB在做此数值运算时,将32判断为整数,因为32768超过整数的范围,因为判断
成长整数,就任意在某个位址的内存上开启 4Byte大小来存放32×1024的值再回存至变量C,因此32×32768可以正常计算。
●怎么解决溢出问题呢?答案就是转换变量的类型,如下:
Private Sub command1_Click()
Dim D As Long
D = CDec(32) * CDec(1024) '转成十进制
D = CDec(-32768) - CDec(1) '转成十进制
D = CLng(32) * CLng(1024) '转成工整数
D = CLng(32767) + CLng(1) '转成长整数
End Sub
全部回答
- 1楼网友:不如潦草
- 2021-11-30 16:26
程序改成如下,就不会有错误了:
Dim s As Long
s = 16384
s = s * 2
Print s
原因是:因为VB两个常数相乘,默认将常数放在Integer中,所以这个问题一定要注意,避免产生不必要的BUG
Dim s As Long
s = 16384
s = s * 2
Print s
原因是:因为VB两个常数相乘,默认将常数放在Integer中,所以这个问题一定要注意,避免产生不必要的BUG
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯