OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4975|回复: 6

这段传进来数组的头指针转换成floa哪里错了啊?为什么返回0

[复制链接]

111

主题

265

帖子

0

精华

高级会员

Rank: 4

积分
740
金钱
740
注册时间
2014-3-4
在线时间
6 小时
发表于 2015-4-21 12:35:52 | 显示全部楼层 |阅读模式
5金钱
这段传进来数组的头指针转换成floa哪里错了啊?为什么返回0
float U8Tofloat(char*convertP)
{
 char i=0;
 union
 {
  float Fval;
  char U8val[4];  
 }temp;
 for(i=0;i<4;i++)
  temp.U8val=*(convertP+i);
 return temp.Fval;
}
//////////////////////////////
下面为完整测试程序
///////////////////////////////

#include"stdio.h"

main()

 char a[4]={0};
 float U8Tofloat(char*convertP);
 scanf("%d%d%d%d",a,(a+1),(a+2),(a+3));
 printf("%f",U8Tofloat(a));
}

float U8Tofloat(char*convertP)
{
 char i=0;
 union
 {
  float Fval;
  char U8val[4];  
 }temp;
 for(i=0;i<4;i++)
  temp.U8val=*(convertP+i);
 return temp.Fval;
}

最佳答案

查看完整内容[请看2#楼]

我目前觉得楼主的函数应该没有问题。 比如4字节float数-7.250000,等于-1*(1+1/2+1/4+1/16)*2^2,所以:符号位是1;指数为2,换为移码则2+127=129,阶码二进制表示为10000001;(1+1/2+1/4+1/16)用二进制小数表示为1.1101,左边最高位的1不需要显式地表达它,所以尾数为1101。因此-7.250000在内存中的机器码是:11000000111010000000000000000000 而LZ的函数中的union中是有符号的char数组,而在机器中是以补码的形式存储,上面的 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2014-3-5
在线时间
65 小时
发表于 2015-4-21 12:35:53 | 显示全部楼层
我目前觉得楼主的函数应该没有问题。
比如4字节float数-7.250000,等于-1*(1+1/2+1/4+1/16)*2^2,所以:符号位是1;指数为2,换为移码则2+127=129,阶码二进制表示为10000001;(1+1/2+1/4+1/16)用二进制小数表示为1.1101,左边最高位的1不需要显式地表达它,所以尾数为1101。因此-7.250000在内存中的机器码是:11000000111010000000000000000000
而LZ的函数中的union中是有符号的char数组,而在机器中是以补码的形式存储,上面的机器码从左到右的:11000000对应的是十进制数-64,11101000对应的十进制数为-24,后面为0,0。所以连续输入0、0、-24、-64,程序的结果是-7.250000。
看下图


如果将程序中的char U8val[4]改为unsigned char U8val[4],无符号的char,那么11000000对应的是十进制数192,11101000对应的十进制数为232。
修改程序后,输入0、0、232、192,运行结果仍然为-7.250000。如下图

急不来总有障碍客观的存在...
回复

使用道具 举报

0

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2014-3-5
在线时间
65 小时
发表于 2015-4-21 21:33:11 | 显示全部楼层
楼主的输入是什么?
我用CodeBlock默认的编译器试了下。先用-3.25这个float数反推了下4字节的数分别是0,0,80,-64,然后再用你的程序,结果如下图

急不来总有障碍客观的存在...
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-4-22 22:45:02 | 显示全部楼层
回复【3楼】文刀言身寸:
---------------------------------
谢谢
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

111

主题

265

帖子

0

精华

高级会员

Rank: 4

积分
740
金钱
740
注册时间
2014-3-4
在线时间
6 小时
 楼主| 发表于 2015-4-24 11:34:55 | 显示全部楼层
回复【3楼】文刀言身寸:
---------------------------------
感谢感谢,我在32上试过了可以,但是用visual 6 c++就显示内存出现问题,一会再看看
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2015-5-13 11:32:28 | 显示全部楼层
scanf("%d%d%d%d",a,(a+1),(a+2),(a+3));字符类型变量存储整形数据,这个数据溢出了吧。
业余程序玩家。
回复

使用道具 举报

111

主题

265

帖子

0

精华

高级会员

Rank: 4

积分
740
金钱
740
注册时间
2014-3-4
在线时间
6 小时
 楼主| 发表于 2015-6-17 10:48:24 | 显示全部楼层
回复【6楼】ofourme:
---------------------------------
没问题,是编译器的事
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-23 18:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表