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

 时间:2026-02-13 18:34:44

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

  • 金脉单药花的养殖方法是什么?
  • 龙血树怎么浇水?
  • 鸽子山药养生汤
  • 包心菜爆炒鸡肉的简单家庭版
  • 童子鸡的做法大全
  • 热门搜索
    亲子共读手抄报 荷花手抄报 抗击疫情的手抄报 2035年的祖国手抄报 快乐成长手抄报 关于科学的手抄报 六一儿童节手抄报内容 国庆节手抄报图片大全 抗击疫情手抄报内容 关于宪法的手抄报