VB自定义函数:有符号数和无符号数的相互转换

2025-10-19 10:52:48

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

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢