ieee 754四字节转浮点数c语言实现,C语言实现 byte 转float IEEE754

在C语言中对于float,用4字节存储,

比如

1.618000  ,在内存中为 160  26 207    63

1.000000,  在内存中为  0      0    128    63

那么我有4个字节数据,比如{160  26 207    63},怎么转成float呢?

其实很简单:

float f;

unsigned char *p = (unsinged char*)&f;

p[0]=160;

p[1]=26;

p[2]=207;

p[3]=63;

然后f,就是1.618了。

但是有些时候,没有用内存直接赋值的这种方法,比如glsl中,

那就需要根据IEEE754标转来进行转换了。

#include

typedef unsigned char byte;

float b2f(byte m0, byte m1, byte m2, byte m3)

{

// 求符号位

float sig = 1.;

if (m0 >=128.)

sig = -1.;

printf("sig %f\n",sig);

//求阶码

float jie = 0.;

if (m0 >=128.)

{

jie = m0-128. ;

}

else

{

jie = m0;

}

jie = jie * 2.;

if (m1 >=128.)

jie += 1.;

printf("jie %f\n",jie);

jie -= 127.;

printf("jie %f\n",jie);

//求尾码

float tail = 0.;

if (m1 >=128.)

m1 -= 128.;

tail = m3 + (m2 + m1 * 256.) * 256.;

printf("tail %f\n",tail);

tail = (tail)/8388608; // 8388608 = 2^23

printf("tail %f\n",tail);

float f = sig * pow(2., jie) * (1+tail);

return f;

}

int main(int argc, char *argv[])

{

float f = 1;

byte *pf = (byte *)&f;

printf("F: %f %d %d %d %d \n", f, pf[0], pf[1], pf[2], pf[3]);

//float 低位在前

byte m0 = pf[3]; //高字节

byte m1 =pf[2];

byte m2 = pf[1];

byte m3 = pf[0]; // 低字节

f = b2f(m0, m1, m2, m3);

printf("b2f %f\n", f);

reutrn 0;

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要了解IEEE 754浮点数的格式。IEEE 754浮点数是一种二进制表示的浮点数,由符号位、阶码和尾数三部分组成。其中,符号位占1位,阶码占8位或11位或15位,尾数占23位或52位或112位。具体格式如下: 单精度浮点数(32位): 符号位 1位 指数位 8位 尾数位 23位 双精度浮点数(64位): 符号位 1位 指数位 11位 尾数位 52位 扩展精度浮点数(80位): 符号位 1位 指数位 15位 尾数位 112位 在C语言中,我们可以使用联合体(union)来方便地进行位操作。具体实现步骤如下: 1. 将16进制数换成二进制数,并将其分为符号位、阶码和尾数三部分。 2. 根据浮点数的格式,确定符号位、阶码和尾数在二进制数中的位置。 3. 将符号位、阶码和尾数存储在联合体中。 4. 访问联合体中的浮点数变量,即可得到对应的IEEE 754浮点数。 下面是一个示例代码,用于将单精度浮点数的16进制编码换成IEEE 754浮点数: ```c #include <stdio.h> typedef union { float f; struct { unsigned int mantissa : 23; unsigned int exponent : 8; unsigned int sign : 1; } parts; } float_cast; int main() { float_cast var; unsigned int hex; printf("Enter a hexadecimal number: "); scanf("%x", &hex); var.parts.sign = (hex >> 31) & 1; var.parts.exponent = (hex >> 23) & 0xFF; var.parts.mantissa = hex & 0x7FFFFF; printf("IEEE 754 format: %d %d %d\n", var.parts.sign, var.parts.exponent, var.parts.mantissa); printf("Float value: %f\n", var.f); return 0; } ``` 在上述代码中,我们定义了一个联合体`float_cast`,其中包含一个`float`类型的浮点数变量和一个包含符号位、阶码和尾数三部分的结构体。在`main`函数中,我们首先读入一个16进制数`hex`,然后将其分别存储到联合体的结构体中。最后,我们通过访问联合体中的浮点数变量,输出对应的IEEE 754浮点数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值