关于大字节序和小字节序



关于大字节序和小字节序

大字节序:把高有效位放在低地址段,例如在按字节寻址的存储器中往地址 0x0001 存放值 0x12345678,在存储器中为
    地址         数值
    0x0004       0x78
    0x0003       0x56
    0x0002       0x34
    0x0001       0x12

小字节序:把低有效位放在低地址段,例如在按字节寻址的存储器中往地址 0x0001 存放值 0x12345678,在存储器中为
    地址         数值
    0x0004       0x12
    0x0003       0x34
    0x0002       0x56
    0x0001       0x78

    在传输半字,字,双字的时候,读取地址时总是由低往高,通常 x86 等指令集用的是小字节序,RISC 等其他指令集用大字节序。在同一指令集中进行数据传输不需要进行字节序转换,在不同的指令集之间进行传输时需要进行字节序转换,如进行网络传输。网络传输用的都是大字节序。

历史:网络由 University of California Berkeley 开发,当时用的是 RISC 指令集。为大字节序,从此以后网络传输为大字节序。

---------------------------------------------------------------------------

对 C 编程的影响

参考下例 (编译运行于 32 位 x86 机器,小字节序):

#include <stdio.h>

typedef struct
{
    union
    {
        unsigned char str[3];
        unsigned long a;
        unsigned short b;
    };
} test;

int main(int argc, char * argv[])
{
    test m;
    m.a = 0x002233ff;
    printf("%p %p %p/n", m.str, &m.a, &m.b);
    printf("0x%x/n", m.b);
    printf("%u %u/n", m.str[0], m.str[3]);

    return 0;
}

输出结果为:(其中第一行的值可能会变化,但不管怎么变,三个值肯定是相同的)
0xbfd4d1d0 0xbfd4d1d0 0xbfd4d1d0
0x33ff
255 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值