多字节整数字节序(小端/大端)

本文探讨了16位整数在内存中的两种存储方式——小端字节序和大端字节序,并解释了主机字节序(各系统可能不同)与网络字节序(统一为大端字节序)的概念。通过示例代码(byteorder.c)展示了如何判断主机字节序。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

《UNIX Network Programming Volume1: The Socket Networking API, Third Edition》
W.Richard Stevens / Bill Fenner / Andrew M.Rudoff

考虑内存中存储一个16位整数,它由2个字节组成,因此存储这两个字节有两种方法:

  • 小端字节序——将低序字节存储在起始地址;
  • 大端字节序——将高序字节存储在起始地址。
MSB(most significant bit,最高有效位):是这个16位值最左边一位;
LSB(least significant bit,最低有效位):是这个16位值最右边一位。
  • 主机字节序:某个给定系统所用的字节序。(遗憾的是,这两种字节序格式都有系统在使用。)
  • 网络字节序:网际协议规定使用大端字节序来传送这些多字节整数。

(byteorder.c:在一个短整型变量中存放2字节的值0x0102,然后查看它的两个连续字节c[0]和c[1],以此确定主机字节序)

#include <stdio.h>

int main(int argc, char **argv) {
    union {
      short  s;
      char   c[sizeof(short)];
    } un;

    un.s = 0x0102;
    printf("Host byte order: ");
    if (2 == sizeof(short)) {
        if (un.c[0] == 1 && un.c[1] == 2)
            printf("big-endian\n");
        else if (un.c[0] == 2 && un.c[1] == 1)
            printf("little-endian\n");
        else
            printf("unknown\n");
    } else
        printf("sizeof(short) = %d\n", sizeof(short));

    return 0;
}

结果(仅限测试主机):

Host byte order: little-endian

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值