[AVR单片机] 求助:4个字节合并为一个unsigned long型的方法

[复制链接]
3581|10
 楼主| sanguanko 发表于 2015-3-16 01:09 | 显示全部楼层 |阅读模式
把数组acc_data_start_EEPROM中的四个字节拼成一个unsigned_long型,示意性程序如下,是这样操作的码?
我用ICCAVR编,烧到M8里,没有得到想要的数:54328855,哪里错了?求助。多谢。


unsigned long acc_data_start;
unsigned char acc_data_start_EEPROM={0x54,0x32,0x88,0x55};
acc_data_start=((acc_data_start_EEPROM[3]<<0x18)+(acc_data_start_EEPROM[2]<<0x10)+(acc_data_start_EEPROM[1]<<0x08)+(acc_data_start_EEPROM[0]));
-|continue;|- 发表于 2015-3-16 08:39 | 显示全部楼层
你想要的数应该是0x54328855,十进制应该是1412597845,如果都不对,可能是模式不对,试试
unsigned char acc_data_start_EEPROM【4】={0x54,0x32,0x88,0x55};
acc_data_start=((acc_data_start_EEPROM[0]<<0x18)+(acc_data_start_EEPROM[1]<<0x10)+(acc_data_start_EEPROM[2]<<0x08)+(acc_data_start_EEPROM[3]));
popeye021 发表于 2015-3-16 09:22 | 显示全部楼层
定义union数据啊


NE5532 发表于 2015-3-16 20:38 | 显示全部楼层
别移位了,太慢了,如楼上,用共用体来组装吧。
 楼主| sanguanko 发表于 2015-3-19 00:36 | 显示全部楼层
移位也做出来了,多谢各位。我的想法是,先实现功能,自己会怎么做就怎么做,然后再优化
 楼主| sanguanko 发表于 2015-3-19 08:46 | 显示全部楼层
是,2个字节合并成unsigned int型成功,但是4个byte合并成unsigned long 型,高16位老是丢
s17701332 发表于 2015-3-20 16:59 | 显示全部楼层
可能是ICCAVR计算时把数据作为int型计算,当左移多余8位时数据丢失,加上强制转化字符(unsigned long)或者单步计算试试。
Adu0227 发表于 2015-3-20 17:18 | 显示全部楼层
需要加上强制类型转换
toofree 发表于 2015-3-23 22:56 | 显示全部楼层
给你个思路吧.

定义一个4字节的数组;
把你想要存的数从低字节到高字节,分别依次存入到数组元素0到3;
定义个字节类型指针,把数组的首地址给这个字节指针,然后把字节指针强制类型转换为 (unsigned long *)类型,然后取数就是你要的unsigned long型数了;

在51单片机时,常这么用。比如有时,要存个浮点数到E2PROM,就直接把浮点数用指针操作,强制转换为unsinged char型指针,然后分四次存入;要取数的时候,也是先取出来,然后用指针强制类型转换取数。
QuakeGod 发表于 2015-3-23 23:01 | 显示全部楼层
指针是C语言的精华。
toofree 发表于 2015-3-23 23:31 | 显示全部楼层
本帖最后由 toofree 于 2015-3-23 23:33 编辑



Win8 64位下Win-TC用不成了,只好用VC6下写了个测试程序,凑合看看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

262

主题

290

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部