Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4078324
  • 博文数量: 251
  • 博客积分: 11197
  • 博客等级: 上将
  • 技术积分: 6862
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 14:41
个人简介

@HUST张友东 work@taobao zyd_com@126.com

文章分类

全部博文(251)

文章存档

2014年(10)

2013年(20)

2012年(22)

2011年(74)

2010年(98)

2009年(27)

分类: LINUX

2009-12-21 19:17:45

端模式(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);
           
}




阅读(2738) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~