c 语言4字节转浮点数,4字节数组转换为浮点数(c)

void OPC_N2_data_read()

{

unsigned int32 iobyte[3][4] = {0x00, };

int32 PM_int[3] = {0x00, };

float PM[3] = {0x00, };

int8 i,j,k;

int8 mask = 0x80;

const int16 mask1 = 0x0001;

const int16 mask0 = 0x0000;

int8 trash_byte = 0x32;

output_bit(ss,1);

output_bit(PM_CLOCK_pin,0);

delay_us (1);

output_bit(ss,0);

delay_us (2);

for(i = 0 ; i < 3 ; i ++)

{

for (j = 0 ; j < 4 ; j ++)

{

for (k = 0 ; k < 8 ; k ++)

{

output_bit(PM_CLOCK_pin,1);

iobyte[i][j] = iobyte[i][j] << 1;

if (input (PM_MISO_pin))

{

iobyte[i][j] |= mask1;

}

else

{

iobyte[i][j] |= mask0;

}

if ((trash_byte & mask) >0)

{

output_high(PM_MOSI_pin);

}

else

{

output_bit(PM_MOSI_pin,0);

}

delay_us(1);

output_bit(PM_CLOCK_pin,0);

delay_us(5);

mask = mask >>1;

}

}

}

delay_us(3);

output_high(ss);

for(i = 0; i<3; i++)

{

PM_int[i] = ((iobyte[i][0]<<24)|(iobyte[i][1]<<16)|(iobyte[i][2]<<8)|(iobyte[i][3]));

PM[i] = *(float*)&PM_int;

}

printf ("%x%x%x%x\r\n",iobyte[0][0],iobyte[0][1],iobyte[0][2],iobyte[0][3]);

printf ("%x%x%x%x\r\n",iobyte[1][0],iobyte[1][1],iobyte[1][2],iobyte[1][3]);

printf ("%x%x%x%x\r\n",iobyte[2][0],iobyte[2][1],iobyte[2][2],iobyte[2][3]);

printf ("%lx,%lx,%lx\r\n", PM_int[0],PM_int[1],PM_int[2]);

printf ("%3.5f,%3.5f,%3.5f\r\n", PM[0],PM[1],PM[2]);

}

我从一个4字节数组接收数据。 该数据是一个浮点值。 我通过电脑检查,我看到以下内容。4字节数组转换为浮点数(c)

e911bd41 d867e641 8084e941 e911bd41,d867e641,8084e941 0.00000,0.00000,0.00000

使得四个数据到一个int值正常工作。 PM_int[0],PM_int[1],PM_int[2]

但是,如果您尝试将其转换为浮点值,则只会显示0.00000。

我不知道问题出在哪里。

2016-11-11

이세영

+0

'PM [I] = *(浮子*)&PM_int;'场所严格的锯齿规则。改用'memcpy'。 –

+2

@ user694733:'memcpy'也会打断它们。打字的唯一完全合法的方式是“联合”。尽管如此,OP应该使用适当的(de)序列化,使用bitshifts和掩码到'uint32_t',然后使用'union'。 –

+1

1)不要使用有符号整数作为位移。某些值将调用未定义的行为,对于其他值则会执行定义。 2)使用固定宽度类型的标准类型,没有自制东西!请参阅'stdint.h' –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值