四字节16进制数转化成浮点数的原理是什么?

floatHex_To_Decimal(unsignedchar*Byte,intnum)//十六进制到浮点数{charcByte[4];//方法一for(inti=0;... float Hex_To_Decimal(unsigned char *Byte,int num)//十六进制到浮点数
{
char cByte[4];//方法一
for (int i=0;i<num;i++)
{
cByte[i] = Byte[i];
}

float pfValue=*(float*)&cByte;
return pfValue;

}

这个函数是可以用,但我不知道他的意思,尤其是float pfValue=*(float*)&cByte,不能理解,哪位大侠能给我详细解释一下吗
展开
 我来答
zdingyun
推荐于2016-09-05 · 知道合伙人软件行家
zdingyun
知道合伙人软件行家
采纳数:15429 获赞数:48169
1982年上海业余工业大学化工系毕业 现退休

向TA提问 私信TA
展开全部

四字节16进制数可转换为四个二进制字节(Bytes),从而使用Api函数来处理成单精度浮点数

以下用VB代码处理。

VB有专门的API函数CopyMemory能处理2-10进制浮点数转换和10-2进制浮点数转换。

下列代码演示了10进制Single(单精度浮点型转为16进制字符显示的浮点数和其相反运算:

Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub BinToSin_Click()
    Dim sinStr As String
    Dim sinSj As Single
    Dim Buffer(3) As Byte
    Dim i As Integer
    sinStr = Text2
    For i = 1 To Len(Text2) Step 2
        Buffer((7 - i) / 2) = Val("&H" & Mid(sinStr, i, 2))
    Next
    CopyMemory ByVal VarPtr(sinSj), ByVal VarPtr(Buffer(0)), 4
    Text3 = sinSj
End Sub
 
Private Sub SinToBin_Click()
    Dim i As Integer
    Dim hexData As String
    Dim a As Single
    Dim Buffer(3) As Byte
    a = Val(Text1)
    CopyMemory Buffer(0), a, 4
    For i = 0 To 3
        If Len(Hex(Buffer(i))) = 1 Then
            hexData = "0" & Hex(Buffer(i)) + hexData
        Else
            hexData = Hex(Buffer(i)) + hexData
        End If
    Next
    Text2 = hexData
End Sub

需要注意的事项是这四字节的高低字节排序,不能搞错。

VB的Single 数据类型

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. XXXXXXX XXXXXXXX XXXXXXXX

其中

F为正号或负号(首为为0正数,首位为1负数

n为2-9位组成的BYTE数据值

XXXXXXX XXXXXXXX XXXXXXXX为尾数

参考:http://blog.csdn.net/zdingyun/article/details/2528026

TableDI
2024-07-18 广告
Excel一键自动匹配,在线免费vlookup工具,3步完成!Excel在线免费vlookup工具,点击58步自动完成vlookup匹配,无需手写公式,免费使用!... 点击进入详情页
本回答由TableDI提供
lc598291606
2012-08-11 · TA获得超过107个赞
知道答主
回答量:230
采纳率:0%
帮助的人:125万
展开全部
c++?c局部变量只能放在函数开头
float pfValue=*(float*)&cByte;
&cByte的地址当作(float*)型指针取内容
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
己闻楣Sx
推荐于2017-12-16 · TA获得超过1935个赞
知道大有可为答主
回答量:1057
采纳率:93%
帮助的人:893万
展开全部
1、4字节指的是有4个内存单元,每个单元各放着一个0~255的整数,拼凑起来形成一个32个二进制位的数儿;
2、根据不同的视角来看待或理解这个数儿,可以得出很多不同的答案;
3、针对你的问题,其实是“将视角切换为单精度浮点数”,单精度浮点数在内存单元中如何表示,是个挺复杂的事儿,具体是国际电气标准IEEE754规定的,如果你能看懂,绝对可以品味到其中的精彩,这个才是最核心的“原理”;
4、从你的描述上看,似乎也并不是想了解到最底层的透彻,仅仅是了解这段程序如何能工作,如果是这样的话,答案是:强制类型转换。(float*)&cByte的意思是带上一副“单精度浮点数”的眼镜,去看cByte数组中的内容,前面再加一个*,意思是“看好了,拿出来”。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式