关于LINUX 大小端模式判断的理解问题

木马男孩 2014-09-30 05:02:56
在linux 系统的kernel/arch/arm/kernel/setup.c 的这个文件中,有如下一段代码,用来判断CPU所处的大小端模式。
static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.l)

假设 c[0]在内存中的地址为0xf0000000 那么 c[1]-c[3]的地址分别为 0xf0000001 0xf0000002 0xf0000003 ,l的地址为0xf0000000;
那么在小端模式中 各地址中的值分别为
0xf0000000 = 'l'
0xf0000001 = '?'
0xf0000001 = '?'
0xf0000001 = 'b'

在大端模式是

0xf0000000 = 'b'
0xf0000001 = '?'
0xf0000001 = '?'
0xf0000001 = 'l'

但是我用数组赋值的方式去理解,怎么也理解不通啊。
对于c={ { 'l', '?', '?', 'b' } }; 应该是这么赋值 c[0]='l'; c[1]='?';c[2]='?'; c[3]='b'
这么看的话,无论是大还是小端,c[0] 总是等于 'l'.
这显然与上面实际的相反啊。请高手解答,我该如何去理解
...全文
434 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mangoalx 2014-10-08
  • 打赏
  • 举报
回复
赋值是用字符数组,所以字符数组总是一样的。判断要用长整形,这就看出不一样了。 #define ENDIANNESS ((char)endian_test.l) 这就是取长整形的最低字节,大小端出来的结果就不同了
木马男孩 2014-10-08
  • 打赏
  • 举报
回复
引用 1 楼 lishanchao 的回复:
楼主说的没错,无论大小端,char c[4]的每个元素都是一样。 如果都是char型数组,确实在内存中,大小端存储没区别。 但是unsigned long型的l中高低位的4字节存储就有差别了。
联合类型数据,,char c[4] 和 unsigned long l 在这里不是共享一个内存么?
沭水河畔 2014-09-30
  • 打赏
  • 举报
回复
楼主说的没错,无论大小端,char c[4]的每个元素都是一样。 如果都是char型数组,确实在内存中,大小端存储没区别。 但是unsigned long型的l中高低位的4字节存储就有差别了。

21,597

社区成员

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

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