字节序

来源:互联网 发布:python subprocess pid 编辑:程序博客网 时间:2024/06/05 06:50

用一个short长度的位域结构体存储钱数。q代表10进制的千位,b百,s十,g个。

显然,这是个BCD码的应用。

struct X {

    unsigned short q : 4;
    unsigned short b : 4;
    unsigned short s : 4;
    unsigned short g : 4;
};

计划是用每4个二进制位表示一个十进制位。最重大的m15~m11位就是千位。

//m15~m12 m11~m8 m7~m4  m3~m0
//   千            百               十             个

void main() {

    X x = { 0 };

    short money = 0x1234;
    memcpy(&x,&money,2);

}

最后得到的结果q=4,b=3,  s=2,   g=1,

在小端序的系统,最不重大的位m4~m0(小头),存在低地址(在前),最重大的m15~m11存放在高地址。

所以,内存中的存放为:

b0~b3     b4~b7   b8~b11     b12~b15

m0~m3  m4~m7 m8~m11    m12~m15

q              b               s                 g                 (而位域的定义,也是从低地址开始的(这一点,同数组一样:a[0]的地址比a[1]低))

4              3              2                 1


解决的办法是:重新定义结构体

struct X {

    unsigned short g: 4;
    unsigned short s : 4;
    unsigned short b : 4;
    unsigned short q : 4;
};

b0~b3     b4~b7   b8~b11     b12~b15

m0~m3  m4~m7 m8~m11    m12~m15

g              s               b                 q                 

4              3              2                 1


讨论:

1) 大小端序,在bit范围内,也是反的

       例如:5  在大端序 是00000101 ; 在小端序 是10100000

2) 在语言层面,文字量是概念值,例如short a=0x05, 这是个概念值5,具体如何存储,由系统决定。

3)序列化是以字节为单位打散数据的,单字节在不同的系统之间传输,大小端的bit层级的转换是系统完成的。

      但是多字节组合的对象,例如int等,需要用编程的手段做顺序调整。