打印

C语言学艺未精,请教个简单的问题

[复制链接]
2308|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zusen|  楼主 | 2008-4-8 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问个简单的C问题
如果将 float 类型的数据写入EEPROM???
因为用I2C写EEPROM时,是以字节来写的(unsigned char)
如果强制将 float类型转为int的话,他后面的小数点就四舍五入了
如何将这个float类型的数据写入EEPROM呢????

3Q~~~~~~~~

相关帖子

沙发
古道热肠| | 2008-4-8 17:07 | 只看该作者

看编译软件规定的符点数占几个字节

再用字符指针强制转换,不就解决了吧。

使用特权

评论回复
板凳
computer00| | 2008-4-8 17:12 | 只看该作者

恩。通常浮点数用4字节,强制转换为char型指针

float f;

EepromWrite(((unsigned char *)&f)[0]);
EepromWrite(((unsigned char *)&f)[1]);
EepromWrite(((unsigned char *)&f)[2]);
EepromWrite(((unsigned char *)&f)[3]);

读的时候刚好倒过来就行了。

使用特权

评论回复
地板
zusen|  楼主 | 2008-4-8 17:14 | 只看该作者

哦,这样也行,先谢两位,试试先

使用特权

评论回复
5
平常人| | 2008-4-8 20:30 | 只看该作者

最好用sizeof决定需要转存变量所占的字节数目

接3楼圈圈的回答:

float f;
int byte;

for (byte=0; byte<sizeof(f); byte++)
   EepromWrite(((unsigned char *)&f)[byte]);

这样可以不考虑变量f的长度,可以在不同系统间移植,当然要注意大小端的问题。

使用特权

评论回复
6
ccxlslr| | 2008-4-8 20:48 | 只看该作者

呵呵,用union结构!

使用特权

评论回复
7
computer00| | 2008-4-9 01:46 | 只看该作者

如果楼主只在同一个系统下写入和读出的话,可以不用管大

使用特权

评论回复
8
hqgboy| | 2008-4-9 08:41 | 只看该作者

联合最简单...

使用特权

评论回复
9
hqgboy| | 2008-4-9 08:42 | 只看该作者

...........

union
{
    float             f;
    unsigned char   c;
    unsigned short  i;     
}iic_data_buf;


while(I2C_ReadNByte(CAT1025, TWO_BYTE_SUBA,I2C_ADDR,(unsigned char *)&iic_data_buf.f, 4)==0){}

使用特权

评论回复
10
computer00| | 2008-4-9 12:58 | 只看该作者

我觉得联合还麻烦,还要单独建立一种数据类型

直接操作更方便,反正都是指针,何必呢……

I2C_ReadNByte(CAT1025, TWO_BYTE_SUBA,I2C_ADDR,(unsigned char *)&f, 4)

使用特权

评论回复
11
hqgboy| | 2008-4-9 13:02 | 只看该作者

呵呵.有联合也可以处理int....char

使用特权

评论回复
12
computer00| | 2008-4-9 13:07 | 只看该作者

没有联合也照样可以处理int...char……

使用特权

评论回复
13
zgl7903| | 2008-4-9 18:17 | 只看该作者

把指针参数写成void*型比较好,可以省去类型转换


I2C_ReadNByte(CAT1025, TWO_BYTE_SUBA,I2C_ADDR,&f, sizeof(double))

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

233

主题

3191

帖子

0

粉丝