将single型的变量值copymemory到内存,再一个字节一个字节读出,不知道结果的格式是什么,请教高人'以下是single输出结果
-----------------------
Byte 1=0
Byte 2=0
Byte 3=2
Byte 4=66
-----------------------'以下是double输出结果
Byte 1=0
Byte 2=0
Byte 3=0
Byte 4=0
Byte 5=0
Byte 6=64
Byte 7=64
Byte 8=64
-----------------------
'codePrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDst As Any, ByVal pSrc As Any, ByVal ByteLen As Long)'API memory functions
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long'constants for API memory functions
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT) Dim pHnd As Long
Dim MemPoint As LongPrivate Sub cmd_Free_Click()
' GlobalFree pHnd
End SubPrivate Sub Command1_Click()
Dim i As Long
Dim test As Single
Dim test3 As Single
Dim test2 As Long
Dim ReadMem As Byte
Dim WriteMem As Byte
Dim tmpStr As String
pHnd = GlobalAlloc(GHND, 80)
MemPoint = GlobalLock(pHnd)
tmpStr = ""
test = 32.5
test2 = 0
test3 = 0
ReadMem = 0
CopyMemory MemPoint , VarPtr(test), 4
For i = 1 To 4
CopyMemory VarPtr(ReadMem), MemPoint + i - 1, i
tmpStr = Trim(Str(ReadMem))
Debug.Print "Byte " & Trim(Str(i)) & "="; tmpStr
ReadMem = 0
Next i CopyMemory VarPtr(test3), MemPoint, 4 GlobalUnlock pHnd
GlobalFree pHnd
End
End Sub
Private Sub Form_Load()
Call Command1_Click
End Sub
-----------------------
Byte 1=0
Byte 2=0
Byte 3=2
Byte 4=66
-----------------------'以下是double输出结果
Byte 1=0
Byte 2=0
Byte 3=0
Byte 4=0
Byte 5=0
Byte 6=64
Byte 7=64
Byte 8=64
-----------------------
'codePrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDst As Any, ByVal pSrc As Any, ByVal ByteLen As Long)'API memory functions
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long'constants for API memory functions
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT) Dim pHnd As Long
Dim MemPoint As LongPrivate Sub cmd_Free_Click()
' GlobalFree pHnd
End SubPrivate Sub Command1_Click()
Dim i As Long
Dim test As Single
Dim test3 As Single
Dim test2 As Long
Dim ReadMem As Byte
Dim WriteMem As Byte
Dim tmpStr As String
pHnd = GlobalAlloc(GHND, 80)
MemPoint = GlobalLock(pHnd)
tmpStr = ""
test = 32.5
test2 = 0
test3 = 0
ReadMem = 0
CopyMemory MemPoint , VarPtr(test), 4
For i = 1 To 4
CopyMemory VarPtr(ReadMem), MemPoint + i - 1, i
tmpStr = Trim(Str(ReadMem))
Debug.Print "Byte " & Trim(Str(i)) & "="; tmpStr
ReadMem = 0
Next i CopyMemory VarPtr(test3), MemPoint, 4 GlobalUnlock pHnd
GlobalFree pHnd
End
End Sub
Private Sub Form_Load()
Call Command1_Click
End Sub
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Sub Command1_Click()
Dim i As Long, b(3) As Byte
Dim test As Single
test = 32.5
CopyMemory b(0), test, 4
For i = 0 To 3
Debug.Print "Byte " & CStr(i + 1) & "=" & b(i)
Next i
End
End Sub
Private Sub Form_Load()
Call Command1_Click
End Sub
谢谢啊。
这个结果我已经有了,我就是想知道它的格式是如何转换的,为什么在内存中的
结果是00 00 02 66.
浮点数据类型都与IEEE( 电气和电子工程师协会)标准的浮点数表示法一致,32位单精度数据格式符合IEEE 754标准。它是X86CPU浮点运算单元真接支持的数据类型。
它存储数字的方式类似于科学计数法,不过不是 10 幂次方,而是 2 的 幂次方。因它是硬件直接支持的东西,若不做硬件设计,大多数人写程序的不会有兴趣再去研究它了。我也算一个^_^我只知道:
IEEE标准从逻辑上用三元组{S,E,M}表示一个数N, 单精度:共32位,其中S占1位,E占8位,M占23位,浮点数=(-1)^s * m * 2^e在Baidu,你搜一下“IEEE 754”,会有大量资料参考的。
其实我是想自己实现一套数据类型,所以需要用到浮点数。
如果有现成的基于x86的代码就不用动脑筋自己写程序啦,呵呵。俺总想着偷懒。
关于浮点数的表示法有一处不懂,
有关m的计算问题。
标准上说m=|1.M|。如M="101",则|1.M|=|1.101|=1.625,即 m=1.625。但不知道 m=|1.M|=|1.101|=1.625 是如何计算的?举个例子:
浮点数5被表示为 0x40a00000,二进制形式为( 0 10000001 01000000000000000000000
)。红色数字为E,可以看出|E|=129>0, 则e=129-bias=129-127=2 ; 蓝色数字为M, 且|E|>0,说明是规格化数,则m=|1.M|=|1.01000..000|=1.25 ; 由n的计算公式可以求得 n=(-1)^0 * 1.25 * 2^2 = 5.
具体的说m=|1.M|=|1.01000..000|=1.25 的1.25是怎样计算的呀?谢谢。
|1.M|=|1.101|=1.625其中.101是二进制小数表示法,二进制小数更准确的说是一种分数表示法,二进制小数最后一个为“1”的位代表“分母”,本身的整数值代表“分子”,此例中,最后一个“1“在第3 位,则分母十进制为2^3=8,分子是101,即十进制的5,这样分数就是5/8,小数就是.625同理01就是.25、1就是.5、11就是.75,001就是.125、011就是.375、111就是.875、。M的值最大是1.9999....最小是0.00000..1,大约是在0-2之间。