尾端与位段

端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。在计算机业界,Endian表示数据在存储器中的存放顺序。下文举例说明在计算机中大小端模式的区别。

大尾端:高位在低地址。

小尾端:尾位在低地址。


   如整数0x12345678在内存中应该如下存放:

  地低: base | base+1 | base+2 | base+3 |

  ------------------------------------- |

  大端 | 12  | 34     | 56    | 78     |

  ------------------------------------- |

  小端 | 78  | 56     | 34    | 12    |

字节内次序:

  大端:高位放在低地址。

  小端:低位放在低地址。

  即大端与小端位序完全是镜像的

测试:

#include <stdio.h>

int main()
{
    struct bitdata
    {
           unsigned bit0_3:4; //只能是int或者unsigned int

           unsigned bit4_7:4;
           unsigned bit8_11:4;
           unsigned bit12_15:4;
    };
    union sdata
    {
          unsigned short data;
          struct bitdata bdata;
    }ssdata;
    
    print_bit(100);
    
    //位段空间测试

    printf("%d\n", sizeof(struct bitdata)); //结果为4

    
    ssdata.data = 0x1234;
    
    //测试尾端,intel采用小尾端 ,输出结果为4 3 2 1

    //大端的字节序与位内序列一致,位段是一个基本单位,字节内多个位段,每个位段会按小尾端存放
    printf("%x\t%x\t%x\t%x\t", ssdata.bdata.bit0_3, ssdata.bdata.bit4_7,
           ssdata.bdata.bit8_11, ssdata.bdata.bit12_15);
           
}




posted @ 2013-04-19 14:04  ydzhang  阅读(142)  评论(0编辑  收藏  举报