如何将一个数组中的4个元素组成一个long型的数据

[复制链接]
6890|32
duguli 发表于 2012-9-4 15:58 | 显示全部楼层
yxwsz 发表于 2012-9-4 16:15 | 显示全部楼层
使用强制指针转换的时候需要考虑两个问题:
1 big endian/little endian的问题;
2 数据地址对齐问题  在ARM, MIPS上有对齐要求,32位访问,其地址必须是4的整倍数; 16位访问,其地址必须是2的整倍数;如果没有满足该要求,会出现数据对齐异常。
NICKY99 发表于 2012-9-4 17:20 | 显示全部楼层
学习了
原野之浪 发表于 2012-9-4 21:48 | 显示全部楼层
本帖最后由 原野之浪 于 2012-9-4 21:54 编辑

楼上有人提到用联合体

一般来讲用联合体是比较臭的做法,就类似与用goto的。
但并不是说用了不好,但大部分场合对大部分人来说是不适用的。

还有用域的,都是比较臭的做法。当然指针强制也好不到哪里去。
从稳定性和规范性来讲的话。

但是如果你的代码的这部分属于固定应用  那么goto啥的 说不准是锦上添花花 看起来更清晰呢
原野之浪 发表于 2012-9-4 21:50 | 显示全部楼层
我也觉得你的这种方法是最好的,开始我这样做的:
    tmp = a[0];
    tmp = (tmp
huzhiyang 发表于 2012-9-3 20:09

呵呵 你这方法很有创意啊

我移位一般这样吧

= A << 16 +  B << 8
原野之浪 发表于 2012-9-4 21:52 | 显示全部楼层
使用强制指针转换的时候需要考虑两个问题:
1 big endian/little endian的问题;
2 数据地址对齐问题  在ARM, MIPS上有对齐要求,32位访问,其地址必须是4的整倍数; 16位访问,其地址必须是2的整倍数;如果没有满足该 ...
yxwsz 发表于 2012-9-4 16:15

arm不对其能咋地? 哪天想起来 我试试看   关键是你没说清楚为什么异常。

多谢
yuanrumeng 发表于 2012-9-4 22:02 | 显示全部楼层
我表示理解,希望大家多多指教
znmcu 发表于 2012-9-4 23:24 | 显示全部楼层
不对齐,一些数据结构的尺寸将比你设想的要大。
Light_David 发表于 2012-9-5 00:16 | 显示全部楼层
:sleepy:这个问题谈来谈去,其实我认为还就是楼主的移位或的方法最实在,不依赖大小端的问题。
换平台啊,编译器啊 在数据传送,打印时才不容易出问题。

就算是对于追求完美的童鞋来说
  在代码执行效率这个方法也增加不了多少(编译器现在都是很智能的,说不定给你优化没了),平台也都跑得欢了,基本上可以忽略这一点。
相反,换平台,换编译器,甚至换电脑(编译器设定)编译结果都会不一样的代码才让人崩溃。
zhang7676050 发表于 2012-9-5 10:50 | 显示全部楼层
p=(char *)tmp;可以强制转化吗 ?貌似不行吧
znmcu 发表于 2012-9-5 11:21 | 显示全部楼层
可以,如果你真的需要绝对寻址
 楼主| huzhiyang 发表于 2012-9-6 11:07 | 显示全部楼层
这是我的znFAT中对大小端无关性的处理:

/***********************************************************************************
功能:由一个小端排列的字节序列,计算得到其在某一字符长度下所表达的整型值
  ...
znmcu 发表于 2012-9-4 15:25
非常感谢啊,我之前看振南视频的时候,讲到单片机驱动音频芯片时,用到了一个软件,能截取一段音频信号,并将其转换成数组,视频主讲人说是振南原创,可以去官网下载,我按照视频上提供的网址,却提示那个网址不存在了,那个软件很好的,不知道你这里有没有,可以共享一下啊……
3htech 发表于 2012-9-7 13:40 | 显示全部楼层
:sleepy:这个问题谈来谈去,其实我认为还就是楼主的移位或的方法最实在,不依赖大小端的问题。
换平台啊,编译器啊 在数据传送,打印时才不容易出问题。

就算是对于追求完美的童鞋来说
  在代码执行效率这个方法也 ...
Light_David 发表于 2012-9-5 00:16

双手赞成
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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