大端模式和小端模式


1. 为什么会产生两种模式:
        在计算机中我们是以字节为单位的,每一个地址单元都对应着一个字节,一个字节就是8位,c语言中char类型之外,还
 有四个字节的int,个字节的longlong类型,并且除了对于超过8位的处理器,比如32位处理器,64位处理器,由于寄存器的宽
 度、大于一个字节就必然存在着字节安排的问题,因此就出现了大端模式和小端模式

2.两种模式的定义:
        在计算机的结构体系中,对于字节,字等的存储机制有所不同,,目前在各个体系的计算机中通常采用的字节存储机制
 主要有两种:大端模式和小端模式,大端模式:就是将高位的数据(权重较高的数据)存放在地址上,小端模式:就是
 将低位的数据(权重较低的数据)存放在低位的地址上,采用大端模式存取数据比较符合人的思维,但是采用小端模式
 存放数据更有利于计算机处理,所以到目前为止,谁好谁坏还没有定论。
 例子:

        如果定义一个整型(int)的变量:int a=0x12345678,这个整型变量在内存中的存储在大小端的不同的模式下存储情况
        大端模式的存储由下图所示:

         小端模式的存储如下图所示:

注意:这里说明一点,存储是以字节为单位的,所以一个字节内的数据是不用遵循大端模式和小端模式的,就像小端模式中是0x78,而

不是0X87 
3.大端和小端的应用:
       谈到字节排序问题就必定会牵扯到两大cpu的派系,那就是motorola的powerPC系列的CPU和intel的X86系列,powerPC系列
 的CPU采用的是大端模式,intel的X86系列采用的是小端模式
       大端模式:网络,大多通信协议是大端的,powerPC,IBM,Sun
       小端模式:主机,一般操作系统是小端的,X86,DEC
        ARM既可以工作在大端模式也可以工作在小端模式
4. 测试本地设备采用的是大端模式还是小端模式:

  第一种方法:定义一个大于一个字节的数据类型的变量假设为变量为a,用小于变量a的数据类型的指针进行强制转化
 将变量地址进行截断,然后再用*间接访问该地址中所存的数据,看看是高位数据还是低位数据,就可以得出结果了,
 代码如下图所示:

 

#include <stdio.h>
bool isbigendian ()
{
    int a=0x12345678;
    char b=(*(char*)&a);
    if (b=0x1)
    {
        return true;
    }
    return false; 
}
int main ()
{
    if(isbigendian ())
    {
        printf ("该设备下是大端模式\n");
    }
    else
    {
        printf ("该设备下是小端模式\n");
    }
    return 0;
}

 

 

 

  第二种方法:运用联合体的特性:联合体union在任何同一时刻联合体都只存放一个被选中的成员,并且所有所有成员都是
 从低地址开始存放,;利用这一特性,我们可以定义一个联合体,先定义一个字节数大于1变量例如int a;在定义一个字
 节数小于变量a的变量,然后将变量a进行赋值,然后访问变量b,如果是高位上的数字就是大端模式,如果是低位上的数
 字就是小端模式,代码如下图所示:

#include <stdio.h>
bool isbigendian1 ()
{
     union sun
    {
        short a;
        char b;
    }sun;
    sun.a=0x1234;
    if (sun.b=0x12)
    {
        return true;
    }
    else
    {
        return false ;
    }
}
int main ()
{
    if (isbigendian1 ())
    {
        printf ("该设备是使用的是大端模式\n");
    }
    else
    {
        printf ("该设备使用的是小端模式\n");
    }
    return 0;
}

 
5.通信:
      网络上传输数据普遍采用的是大端模式,powerPC处理器主导网络市场,可以绝大多数的通信设备都使用的是powerPC处
 理器这也可能就是网络上绝大多数的协议采用的是大端模式的原因,因此,在使用小端模式处理器需要使用网络通信时
 需要在软件中处理端模式的转变

posted @ 2017-10-21 22:42  小乖不乖  阅读(1144)  评论(0编辑  收藏  举报