VB Byte型数组溢出
代码如下:PublicStarTEXTAsLongPublicEndTEXTAsLongDimfb()AsByteDimflAsLongfl=FileLen(FileNa...
代码如下:
Public StarTEXTAs Long
Public EndTEXT As Long
Dim fb() As ByteDim fl As Long
fl = FileLen(FileNameText)
ReDim fb(fl - 1)
'检查文件长度标准
If (fl - 52) Mod 528 <> 0 Then
FileNameText = ""
Exit Function
End If
'读取文件数据
Open FileNameText For Binary As #1
Get #1, , fb
Close #1
'读取信息
Startext = fb(53) * &H100 + fb(52)
Endtext = fb(fl - 527) * &H100 + fb(fl - 528) '#######提示溢出######
Erase fb
'###如果换成这样就可以
Endtext = ("&H" + Right("0" + Hex(fb(fl - 527)), 2) + Right("0" + Hex(fb(fl - 528)), 2))
问题出在哪里 展开
Public StarTEXTAs Long
Public EndTEXT As Long
Dim fb() As ByteDim fl As Long
fl = FileLen(FileNameText)
ReDim fb(fl - 1)
'检查文件长度标准
If (fl - 52) Mod 528 <> 0 Then
FileNameText = ""
Exit Function
End If
'读取文件数据
Open FileNameText For Binary As #1
Get #1, , fb
Close #1
'读取信息
Startext = fb(53) * &H100 + fb(52)
Endtext = fb(fl - 527) * &H100 + fb(fl - 528) '#######提示溢出######
Erase fb
'###如果换成这样就可以
Endtext = ("&H" + Right("0" + Hex(fb(fl - 527)), 2) + Right("0" + Hex(fb(fl - 528)), 2))
问题出在哪里 展开
1个回答
展开全部
'类型转换问题:
'由于fb数组是byte类型的,所以计算 fb(53) * &H100 时,是在 byte 范围内计算的,如果计算结果超过255,当然要溢出了。
'
'
'最好的方法应该这样改(强制类型转换):
'
'读取信息
StarTEXT = CLng(fb(53)) * &H100 + fb(52)
EndTEXT = CLng(fb(fl - 527)) * &H100 + fb(fl - 528)
'
'
'CLng() 函数的功能就是转换成 long 范围,在 long 范围内计算,就不会溢出了。
'
'千万不要像你那样改,你那样改的话,把数值转换为字符串,然后给long值,中间又要由字符串数值型型转换为数值型,效率极低的。
'
'
总结经验:
编程的时候一定要注意类型,如果类型不匹配,自己用 CLng() CInt() CByte() CStr() CBool() CDbl() CSng() 这样的函数,尤其是中间计算的时候要注意考虑一下是否会超范围,如果可能超范围,就要用比较大范围的类型转换函数把前一个变量包起来。
赋值的时候,也要注意等号左边的变量和右边的表达式,类型是否一致(哪怕是 Byte 和 Integer 之间),不一致的话要讨论是否会出现溢出的情况,即使不会溢出,也要显示转换一下,养成习惯。
'
'给你一个实例程序:
Private Sub Form_Load()
Dim b As Long, s As String
s = InputBox("请输入一个数:")
b = CLng(Val(s))
'注意:s 是字符型的,用 val 函数转成数值型的,最后转换成 long 数值型的,才赋值给 b 。千万不要直接 b = InputBox("请输入一个数:") ,这样可能出现类型不匹配的错误。
If b Mod 2 = 0 Then
MsgBox "你输入的是偶数!"
Else
MsgBox "你输入的是奇数!"
End If
End Sub
'由于fb数组是byte类型的,所以计算 fb(53) * &H100 时,是在 byte 范围内计算的,如果计算结果超过255,当然要溢出了。
'
'
'最好的方法应该这样改(强制类型转换):
'
'读取信息
StarTEXT = CLng(fb(53)) * &H100 + fb(52)
EndTEXT = CLng(fb(fl - 527)) * &H100 + fb(fl - 528)
'
'
'CLng() 函数的功能就是转换成 long 范围,在 long 范围内计算,就不会溢出了。
'
'千万不要像你那样改,你那样改的话,把数值转换为字符串,然后给long值,中间又要由字符串数值型型转换为数值型,效率极低的。
'
'
总结经验:
编程的时候一定要注意类型,如果类型不匹配,自己用 CLng() CInt() CByte() CStr() CBool() CDbl() CSng() 这样的函数,尤其是中间计算的时候要注意考虑一下是否会超范围,如果可能超范围,就要用比较大范围的类型转换函数把前一个变量包起来。
赋值的时候,也要注意等号左边的变量和右边的表达式,类型是否一致(哪怕是 Byte 和 Integer 之间),不一致的话要讨论是否会出现溢出的情况,即使不会溢出,也要显示转换一下,养成习惯。
'
'给你一个实例程序:
Private Sub Form_Load()
Dim b As Long, s As String
s = InputBox("请输入一个数:")
b = CLng(Val(s))
'注意:s 是字符型的,用 val 函数转成数值型的,最后转换成 long 数值型的,才赋值给 b 。千万不要直接 b = InputBox("请输入一个数:") ,这样可能出现类型不匹配的错误。
If b Mod 2 = 0 Then
MsgBox "你输入的是偶数!"
Else
MsgBox "你输入的是奇数!"
End If
End Sub
参考资料: http://baike.baidu.com/view/1229921.htm
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询