大小端模式的判断方法

1. 大小端模式

大端模式:数据的高字节存储在内存的低地址中。
小端模式:数据的低字节存储在内存的低地址中。
两种模式的区别就是数据在内存中是先存储高字节还是低字节,先存高字节就是大端模式,先存低字节就是小端模式。

为什么会有小端字节序?

答案是,计算机电路先处理低位字节,效率比较高。因为计算都是从低位开始处理,所以计算机的内部处理都是小端字节序。计算机读取数据时从低地址开始读。
但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

例如:
32bit的数据 0x12345678,数据的字节顺序是左高右低,即左边是数据的高字节,右边是数据的低字节
大端模式存储方式为:

内存地址0x40000x40010x40020x4003
存放内容0x120x340x560x78

小端模式存储方式为:

内存地址0x40000x40010x40020x4003
存放内容0x780x560x340x12

2. 判断方法

方法一: 使用强制类型转换

#include <iostream>
using namespace std;
int main()
{
    int a = 0x1234;
    //由于 int 和 char 的长度不同,借助 int 型转换成 char 型,只会留下低地址的部分
    char b = (char)(a);
    if (b == 0x12)
        cout << "big endian" << endl;
    else if(b == 0x34)
        cout << "little endian" << endl;
}

方法二:使用联合体union

结构体和联合体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),联合体占用的内存等于最长的成员占用的内存。联合体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

#include <iostream>
using namespace std;
// 联合体占用内存的空间为每个成员字节长度的最大值
union endian
{
    int a;
    char b;
};
int main()
{
    endian e;
    e.a = 0x1234;
    // a 和 b 共用 4 字节的内存空间
    if (e.b == 0x12)
        cout << "big endian"<<endl;
    else if (e.b == 0x34)
        cout << "little endian"<<endl;
}

以上两种测试方法的输出结果都是:

little endian

x86架构的CPU都是小端模式,可以验证我的机器确实是小端模式。

参考:
https://www.cnblogs.com/wangweigang/p/9679642.html
https://www.cnblogs.com/gremount/p/8830707.html

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VectorAL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值