ARM 大小端问题

pyx_code 2012-06-08 05:04:03
看过有些资料说:如果实际的存储格式与芯片的存储格式不符时,只有以字为单位的数据存取才正确,否则将出现不可预期的结果,这是如何理解的?
比如:现在arm是小端格式,如int i = 0x44332211存入flash中的0地址,现在 地址0是11,地址1是22,地址2是33,地址3是44;

现重启arm并在初始化为大端格式并读取0地址的值,i = *(int *)0x0;i还会为0x44332211吗?
...全文
452 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjtea 2012-06-11
  • 打赏
  • 举报
回复
小端存放的0x44332211,大端读出来,当然是0x11223344。
所谓,存取正确,仅仅说的是,如果你按大端把字再存回去,还会与原来的存储的一样。即再按小端读出来,还是0x44332211。反之, 如果按字节来操作,想读高半字,就会读到低半字;存储的情况也相似。
但是,如果要进行运算,小端存,大端来运算,肯定是不对的。
daviddb7 2012-06-11
  • 打赏
  • 举报
回复
大小端只与CPU有关。
大端写,小端读,肯定就高低字节反了啊。
即使是以字节方式读,也不一定正确,你知道哪个字节应该放在高位吗?
4个字节拼成一个int,还是会错。
aidehua1988 2012-06-10
  • 打赏
  • 举报
回复
跟存储器的模式有关吧?~~~~~
lr2131 2012-06-10
  • 打赏
  • 举报
回复
上面说的“只有以字为单位的数据存取才正确”好像不对吧,应该是以字节为单位存储数据才不会有大小端的问题吧。毕竟字节内部是没有大小端之分的。不过编译器安排字节型数据的地址可能要占用一个字的地址,那么0x11占用0x00-0x03地址,0x22占用0x04-0x07地址,0x33占用0x08-0x0b地址,0x44占用0x0c-0x0e地址。这样的话数据会有点浪费,不过如果是少量的数据可以这样试试,大量的话可能要换方法了。
如果编译器安排这些字节型数据的地址能紧凑点话,那就好办了。编译器具体是按上面哪种方式进行的,我也没注意过,或许还和编译器的设置有管。LZ可以写个小程序试试看,打印一下开辟的内存地址就差不多了。

不过大小端都是基于内存而言,从flash读出来的数据会不会和这个有关,还真没注意过,我猜的话,读出来的数据是0x11223344。LZ自己写个小程序试试,应该不难做,毕竟实际结果才有说服力。想要代码好写又容易懂的话就用共用体的方式。如果对指针熟悉的话,也可以用指针,只是麻烦些,也不容易阅读。
union{
int a;
unsigned char b[4];
}

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧