VB自定义函数:有符号数和无符号数的相互转换
1、一、自制函数源代码
在网上也找不到解决办法,怎么办?难道我也要放弃VB吗?
不!决不!
经过苦思冥想,终于制作出了用于解决的函数Unsigned()。
'有符号转无符号
Public Function unSigned(hNum As String) As Double
Dim isDbl As Double, fNum As Byte
If InStr(hNum, "&H") Then hNum = Replace(hNum, "&H", "")
If Len(hNum) <> 8 Then
isDbl = "&H" & hNum
Else
fNum = "&H" & Left(hNum, 1)
Do
If fNum > 7 Then
fNum = fNum - 7
isDbl = isDbl + "&H70000000"
Else
isDbl = isDbl + ("&H" & fNum & Right(hNum, 7))
Exit Do
End If
Loop
End If
unSigned = isDbl
End Function
2、二、原理说明
函数Unsigned()接收参数hNum为十六进制数,即然大于等于“&H80000000”的数都是负数,那么我就以“&H70000000”作为一个分界线,只要大于“&H70000000”就减“&H70000000”,然后相加,举例如下:
Sub Test_wanao()
Dim Eax As Double
Eax = unSigned("&H87654321")
End Sub
函数Unsigned()的工作原理就是:“&H70000000”+"&H17654321"。
3、三、反向转换
其实,有些时候,也会需要“无符号转有符号”,所以,我就又制作出了下面这个“无符号转有符号”函数:
Public Function Signed(ByVal hNum As Double) As Double
If hNum < 4294967296# And hNum > 2147483647 Then
hNum = hNum - 4294967296#
End If
Signed = hNum
End Function
这个函数的原理很简单,大于2147483647(即:十六进制“&H7FFFFFFF”)的数全部减4294967296(即:十六进制“&H100000000”,一个1,八个0)。
4、四、测试
Sub Test_wanao()
Dim Eax As Double, Ebx As Double, Ecx As Double
Eax = unSigned("87654321")
Ebx = "&H87654321"
Ecx = Signed(Eax)
Stop
End Sub
大家猜一下,Eax、Ebx、Ecx各是多少?
首先Ebx为VB默认的有符号型,所以Ebx =-2023406815
Eax为无符号型,Eax = 2271560481
Ecx为有符号型,Ecx =-2023406815