本帖最后由 ting19850104 于 2010-03-09 04:10:29 编辑

解决方案 »

  1.   

    VB 中没有无符号整数,所以 &H9E3779B9 是负数。
    你可以声明为 Currency 类型,将无符号的 0x9E3779B9 转换成对应的正数
        Dim a As Currency
        a = 2147483648@ + &H1E3779B9
        a = a + _
            sUrl(k + 0) + _
            (sUrl(k + 1) * (2 ^ 8)) + _
            (sUrl(k + 2) * (2 ^ 16)) + _
            (sUrl(k + 3) * (2 ^ 24))
        Debug.Print a
      

  2.   

    稍改一下
        Dim a As Currency
        a = CCur(&H2E3779B9) + &H70000000  '0x9E3779B9=0x2E3779B9+ 0x70000000
        '此处因为做了^运算,相应的数据类型自动转化为Double型了,否则还需要考虑数据溢出的问题
        a = a + _
            sUrl(k + 0) + _
            (sUrl(k + 1) * (2 ^ 8)) + _
            (sUrl(k + 2) * (2 ^ 16)) + _
            (sUrl(k + 3) * (2 ^ 24))
        Debug.Print a
      

  3.   

    谢谢楼上2位的热心回复。
    但我还有一点不明白,就是那2个公式是怎么得出来的。
    a = 2147483648@ + &H1E3779B9
    a = CCur(&H2E3779B9) + &H70000000这个a的值可能要经常变动。在c#里有uint类型,所以直接用a的值也没负数。。
      

  4.   

    &H9E3779B9 由于最高位 &H80000000 的存在才成了负数,所以去掉最高位得 &H1E3779B9,再加上无符号数 0x80000000 对应的正数 2147483648。
    可以用下面的函数进行转换
    Function UInt32(byval l as long) as currency
        if (l and &H80000000) <> 0 Then
            UInt32 = 2147483648@ + (l and &H7FFFFFFF)
        else
            UInt32 = l
        end if
    end functiona = UInt32(&H9E3779B9)