zoukankan      html  css  js  c++  java
  • 大端序和小端序

    http://www.cnblogs.com/flysnail/archive/2011/10/25/2223721.html

    一、概述

    字节序,又称端序尾序,英文:Endianness

    在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。

    大小端序跟硬件的体系结构有关,所有x86系列的pc机都是小端序,跟操作系统无关。在x86系列的pc上的solaris系统是小端序,sun sparc平台的solaris是大端序。

    大端字节序,高字节存于内存低地址,低字节存于内存高地址;小端字节序反之。

    如一个long型数据0x12345678
    大端字节序:
    内存低地址--> 0x12
                        0x34
             0x56
    内存高地址--> 0x78

    小端字节序:
    内存低地址--> 0x78      
           0x56
           0x34
    内存高地址--> 0x12



    1. 二、大端序和小端序

    大端序(英:big-endian)或称大尾序

    Big-Endian.svg
    数据以8bit为单位:

    地址增长方向  →

    ...

    0x0A

    0x0B

    0x0C

    0x0D

    ...

    示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。

    数据以16bit为单位:

    地址增长方向  →

    ...

    0x0A0B

    0x0C0D

    ...

    最高的16bit单元0x0A0B存储在低位。

    小端序(英:little-endian)或称小尾序。

    Little-Endian.svg
    数据以8bit为单位:

    地址增长方向  →

    ...

    0x0D

    0x0C

    0x0B

    0x0A

    ...

    最低有效位(LSB,Least Significant Byte)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。

    数据以16bit为单位:

    地址增长方向  →

    ...

    0x0C0D

    0x0A0B

    ...

    最低的16bit单元0x0C0D存储在低位。

    采用大端序的CPU和采用小端序的CPU不仅在字节上是相反的,在比特位上也是相反的。
    比如0x01在内存中的存储
    大端序:内存低比特位 00000001 内存高比特位
    小端序:内存低比特位 10000000 内存高比特位

    比如0x00000001
    大端序:内存低比特位 00000000 00000000 00000000 00000001 内存高比特位
    小端序:内存低比特位 10000000 00000000 00000000 00000000 内存高比特位

    三、判定方法

    typedef struct tagRegion{
        unsigned char region1:1;
        unsigned char region2:6;
        unsigned char region3:1;
    } REGION;
     
    union {
     REGION bb;
     unsigned char aa;
    } cc;
     
    int main(int argc, char* argv[])
    {
        cc.bb.region1 =1;
       printf("Hello World! %d/n",cc.aa);   //打印1表示小端,打印128表示大端。
       return 0;
    }

      

    static unsigned char isBigEndian()
    {
            const unsigned short test= 0xFF00;
            return *((unsigned char *) &test);
    };

      使用以下方式更简洁一些:

    复制代码
     1 #include <iostream>
    2 using namespace std;
    3
    4 int main(int argc, char **argv)
    5 {
    6 short s = 0x0102;
    7 if((*(unsigned char*)&s) == 2)
    8 cout<<"little endian"<<endl;
    9 else if((*(unsigned char*)&s) == 1)
    10 cout<<"big endian"<<endl;
    11 else
    12 cout<<"unknown endian "<<endl;
    13
    14 return 0;
    15 }
    复制代码
  • 相关阅读:
    JVM内存模型
    生产者与消费者的Java实现
    kafka常用命令
    java中join用法
    elasticsearch关于索引切分的实现
    三十六进制加法
    leetCode之Median of Two Sorted Arrays
    腾讯云“动态加速”与“CDN”的区别——浅谈对“动态加速”的理解(可能有误)
    洗澡或游泳等导致的耳朵进水的解决方案
    windows服务器间文件同步搭建步骤搜集
  • 原文地址:https://www.cnblogs.com/jukan/p/5287374.html
Copyright © 2011-2022 走看看