node | 大端模式和小端模式

大端模式(Big-endian)

高位字节排放在内存的低地址端,低位字节排放在内存的高地址端,即正序排列,高尾端;
在这里插入图片描述

小端模式(Little-endian)

低位字节排放在内存的低地址端,高位字节排放在内存的高地址端,即逆序排列,低尾端;
在这里插入图片描述

例(无论是小端模式还是大端模式。每个字节内部都是按顺序排列)

我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

如何判断机器的字节序 (重点)

一般都是通过 union 来测试的,下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:

#include <stdio.h>
 
int main (void)
{
union{
short i;
char a[2];
}u;//联合体u
 
u.a[0] = 0x11;
u.a[1] = 0x22;
 
printf ("0x%x\n", u.i); //0x2211 为小端 0x1122 为大端
return 0;
}
 
输出结果:
0x2211

union 型数据所占的空间等于其最大的成员所占的空间。对 union 型的成员的存取都是相对于该联合体基地址的偏移量为 0 处开始,也就是联合体的访问不论对哪个变量的存取都是从 union 的首地址位置开始。

联合是一个在同一个存储空间里存储不同类型数据的数据类型。这些存储区的地址都是一样的,联合里不同存储区的内存是重叠的,修改了任何一个其他的会受影响。那么通过强制类型转换,判断其实存储位置,也可以测试大小端了:

#include <stdio.h>
 
int main (void)
{
short i = 0x1122;
char *a = (char*)(&i);
 
printf ("0x%x\n", *(a + 0)); //大端为 0x11 小端为 0x22
printf ("0x%x\n", *(a + 1));
return 0;
}
 
输出结果:
0x22
0x11
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值