字节序(Endianness)简介

字节序(Endianness)简介

字节序(Endianness)指的是多字节数据的内存排列顺序。

字节的排列方式有两个:

大端序(Big-Endian)将数据的低位字节存放在内存的高位地址,高位字节存放在低位地址。

小端序(Little-Endian)将数据的的低位字节放在较小的地址处,高位字节放在较大的地址处。

比如数字 0x1A 34 5C 78在内存中的表示形式为:

1)大端模式:

低地址 -----------------> 高地址

0x1A  |  0x34  |  0x5C  |  0x78

2)小端模式:

低地址 ------------------> 高地址

0x78  |  0x5C  |  0x34  |  0x1A

为什么会有大小端模式之分呢?

这是因为在计算机中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8 bit,对于多字节的数据,如C语言的int(32位机中一般占4字节),那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

字节顺序使用情况:

以1字节为基本单位的文件格式独立于字节顺序,例如ASCII文件。

其他文件格式使用一些固定的端顺序格式,例如JPEG文件以大端顺序格式存储。

java 全部为大端(与平台无关): Java二进制文件中的所有内容都以大端顺序存储。这意味着如果您只使用Java,那么所有文件在所有平台(Mac、PC、UNIX等)上的处理方式都是相同的。

C语言默认是小端模式:用C语言编写的程序通常使用 小端顺序。

测试C语言的字节序的代码

代码一:

#include <stdio.h>

int main (void)
{
    union
    {
        short i;
        char a[2];
    }u;

    u.a[0] = 0x11;
    u.a[1] = 0x22;

    printf ("0x%x\n", u.i); //0x2211 为小端;0x1122 为大端

    return 0;

}

输出:

0x2211

或者,用代码二:

#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

字节序是由什么决定的?

字节序就是数据存储的格式。对于操作系统之上的应用程序来说,字节序实际上是由操作系统和编译器决定的。只要操作系统和编译器支持,你就可以使用这种字节序。但是,如果使用了CPU不支持的字节序,数据访问时就必须先转换为CPU支持的字节序,将会加大的降低程序效率。因此操作系统和编译器所提供给应用程序的运行环境的默认字节序一定是CPU支持的字节序。但是,由于以太网协议等很多通信协议、硬件接口的数据格式都是大字节序,因此需要使用这些协议或硬件的程序在数据访问时必须使用大字节序,当然程序本身仍然必须使用操作系统默认的字节序。不过,应用程序也无需过于担忧,只需要在必须使用指定字节序的时候使用操作系统提供的字节序转化函数将默认字节序转换成需要的字节序即可,其他的自然有操作系统和编译器帮你搞定。此段摘自:https://www.zhihu.com/question/65234861/answer/229751964

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学习&实践爱好者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值