Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38。Single 的类型声明字符为感叹号 (!)。
在内存以32位二进制形式存在:
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
第1位为符号位
第2-9位为阶码位
第10-32位为2进制小数尾值
即F2 ^ n * 1.XXXXXXXXXXXXXX
其中
F为正号或负号(首为为0正数,首位为1负数
n为2-9位组成的BYTE数据值
XXXXXXXXXXXXXX为尾数
VB无专门的内置函数处理2-10进制转换及浮点16进制小数转10进制.
以下代码解决2进制位运算来完成四个十六进制的Byte型转换为浮点数:
Option Explicit
Dim i As Integer
Dim j As Integer
Dim bl As String
Dim bl_dm As String
Dim BinData As String
Dim ccl() As String
Dim Ccll() As String
Dim fh As String * 1
Dim zs As String * 8
Dim zssz As String
Dim xs As String * 23
Dim xs_js(23) As Byte
Dim xs_hj As Double
Dim bb_h(1) As String
Dim bb_hh(1) As String
Dim bll_0 As String
Dim single_Data As Single
Private Sub cmdshuru_Click()
BinData = ""
bl = UCase(InputBox("输入16进制浮点数=", bl))
Text1 = bl
Call Hex_bin '
fh = Mid(BinData, 1, 1) '取符号
zs = Mid(BinData, 2, 8) '取指数
xs = Mid(BinData, 10, 23) '取2进制小数
Call xsjs '返回10进制浮点小数部分
Call bin_hex '返回2进制指数部分
If fh = 0 Then
single_Data = 2 ^ (Val("&H" & zssz) - 127) * xs_hj
ElseIf fh = 1 Then
single_Data = -2 ^ (Val("&H" & zssz) - 127) * xs_hj
End If
Text2 = single_Data '
End Sub
Public Function bin_hex()
'2-16转换
bb_h(0) = Mid(zs, 1, 4)
bb_h(1) = Mid(zs, 5, 4)
For i = 0 To 1
If bb_h(i) = "1111" Then
bb_hh(i) = "F"
ElseIf bb_h(i) = "1110" Then
bb_hh(i) = "E"
ElseIf bb_h(i) = "1101" Then
bb_hh(i) = "D"
ElseIf bb_h(i) = "1100" Then
bb_hh(i) = "C"
ElseIf bb_h(i) = "1011" Then
bb_hh(i) = "B"
ElseIf bb_h(i) = "1010" Then
bb_hh(i) = "A"
ElseIf bb_h(i) = "1001" Then
bb_hh(i) = "9"
ElseIf bb_h(i) = "1000" Then
bb_hh(i) = "8"
ElseIf bb_h(i) = "0111" Then
bb_hh(i) = "7"
ElseIf bb_h(i) = "0110" Then
bb_hh(i) = "6"
ElseIf bb_h(i) = "0101" Then
bb_hh(i) = "5"
ElseIf bb_h(i) = "0100" Then
bb_hh(i) = "4"
ElseIf bb_h(i) = "0011" Then
bb_hh(i) = "3"
ElseIf bb_h(i) = "0010" Then
bb_hh(i) = "2"
ElseIf bb_h(i) = "0001" Then
bb_hh(i) = "1"
ElseIf bb_h(i) = "0000" Then
bb_hh(i) = "0"
End If
Next i
zssz = bb_hh(0) & bb_hh(1)
End Function
Public Function Hex_bin()
'16-2转换
ReDim ccl(1 To Len(bl))
ReDim Ccll(1 To Len(bl))
For i = 1 To Len(bl)
ccl(i) = Mid(bl, i, 1)
Next i
For j = 1 To Len(bl)
bl = ccl(j)
If bl = "F" Then
bl_dm = "1111"
ElseIf bl = "E" Then
bl_dm = "1110"
ElseIf bl = "D" Then
bl_dm = "1101"
ElseIf bl = "C" Then
bl_dm = "1100"
ElseIf bl = "B" Then
bl_dm = "1011"
ElseIf bl = "A" Then
bl_dm = "1010"
ElseIf bl = "9" Then
bl_dm = "1001"
ElseIf bl = "8" Then
bl_dm = "1000"
ElseIf bl = "7" Then
bl_dm = "0111"
ElseIf bl = "6" Then
bl_dm = "0110"
ElseIf bl = "5" Then
bl_dm = "0101"
ElseIf bl = "4" Then
bl_dm = "0100"
ElseIf bl = "3" Then
bl_dm = "0011"
ElseIf bl = "2" Then
bl_dm = "0010"
ElseIf bl = "1" Then
bl_dm = "0001"
ElseIf bl = "0" Then
bl_dm = "0000"
Else:
bl_dm = ""
End If
Ccll(j) = bl_dm
BinData = BinData & Ccll(j)
Next j
End Function
Private Sub Form_Load()
Text1 = "": Text2 = ""
End Sub
Public Function xsjs()
xs_hj = 1
For i = 1 To 23
xs_js(i) = Mid(xs, i, 1)
xs_hj = xs_hj + Val(xs_js(i)) / (2 ^ (1 * i))
Next
End Function