我在ms访问时使用vba,发现,如果我的参数大于0x8000 小于0x10000,结果为负数
例如。 Val(“& H8000”)= - 32768 Val(“& HFFFF”)= -1
我怎样才能得到无符号数? 谢谢!
答案 0 :(得分:3)
这里有一个问题:
?TypeName(&HFFFF) Integer
Integer
类型是16位,65,535溢出它。这可能有些过分,但写起来很有趣:
Function ConvertHex(ByVal value As String) As Double
If Left(value, 2) = "&H" Then
value = Right(value, Len(value) - 2)
End If
Dim result As Double
Dim i As Integer, j As Integer
For i = Len(value) To 1 Step -1
Dim digit As String
digit = Mid$(value, i, 1)
result = result + (16 ^ j) * Val("&H" & digit)
j = j + 1
Next
ConvertHex = result
End Function
此函数从右侧开始迭代每个数字,计算其值并在移动到最左边的数字时将其添加到结果中。
?ConvertHex("&H10")
16
?ConvertHex("&HFF")
255
?ConvertHex("&HFFFF")
65535
?ConvertHex("&HFFFFFFFFFFFFF")
281474976710655
我怀疑,有更好的方法可以做到这一点。 Credits to @Jonbot for this one:
Function ConvertHex(ByVal value As String) As Currency
Dim result As Currency
result = CCur(value)
If result < 0 Then
'Add two times Int32.MaxValue and another 2 for the overflow
'Because the hex value is apparently parsed as a signed Int64/Int32
result = result + &H7FFFFFFF + &H7FFFFFFF + 2
End If
ConvertHex = result
End Function
答案 1 :(得分:2)
在十六进制文字中附加一个&符号以强制转换为32位整数:
Val("&HFFFF" & "&") == 65535
Val("&H8000&") == +32768
答案 2 :(得分:2)
请勿使用Val
。请改用其中一个内置转换函数:
?CCur("&HFFFF")
65535
?CDbl("&HFFFF")
65535
在这种情况下,请Currency
优先于Double
,以避免出现浮点问题。