将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

解决方案 »

  1.   

    浮点数的存储和整型有很大差别的,我也不知道浮点如何Copy
      

  2.   

    粗略看了一下,这个语句“CopyMemory VarPtr(ReadMem), MemPoint + i - 1, i”“i”应该是1之误吧。
      

  3.   

    弯子绕大了,实在不懂转这么大一圈是为了什么?下面的代码就是你要结果:
    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
      

  4.   

    to:homezj(小吉)
    谢谢啊。
    这个结果我已经有了,我就是想知道它的格式是如何转换的,为什么在内存中的
    结果是00 00 02 66.
      

  5.   

    Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38。
    浮点数据类型都与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”,会有大量资料参考的。
      

  6.   

    谢谢homezj(小吉)兄 的指导,我先看看有不懂的再来请教。
    其实我是想自己实现一套数据类型,所以需要用到浮点数。
    如果有现成的基于x86的代码就不用动脑筋自己写程序啦,呵呵。俺总想着偷懒。
      

  7.   

    to: homezj(小吉)兄
    关于浮点数的表示法有一处不懂,
    有关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是怎样计算的呀?谢谢。
      

  8.   

    哎!对IEEE 754标准,我并没研究,不过,通过你的提问,我看了一下,并不难。你的问题:
    |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之间。
      

  9.   

    谢谢homezj(小吉)兄的帮助,总算搞明白了浮点数表示法^-^