zoukankan      html  css  js  c++  java
  • 如何判断CPU字节序之[Big-endian vs Little-endian]

    【本文链接】

    http://www.cnblogs.com/hellogiser/p/big-endian-vs-little-endian.html

    【Big-endian vs Little-endian】

      超过一个字节的数据在内存中会用几个字节存储,根据数据在内存的存放方式,分大端模式(Big-endian)和小端模式(Little-endian)。

      大端模式是将数据的高位存在内存的低位地址;小端模式而是将数据的高位存在内存的高位地址,以下是十六进制0x12345678在内存地址的两种存储方式(假设数据是按原码存储),0x12345678中,12是高位,78是低位。

            

    对于Big-endian,其MSB(Most Significant Byte,最高有效字节)为0x12,其LSB (Least Significant Byte,最低有效字节)为0x78。

    对于Little-endian,其MSB(Most Significant Byte,最高有效字节)为0x78,其LSB (Least Significant Byte,最低有效字节)为0x12。

    从上面的例子可以看到,采用Big-endian方式存储数据是符合我们人类的思维习惯的。

    谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。IBM, Motorola(Power PC), Sun的机器一般采用Big-endian方式存储数据。而x86系列则采用Little-endian方式存储数据。

    【Why】

      为什么要注意字节序的问题?
      在单机环境里的程序不用考虑字节序(endian)的问题,因为字节序的不同是在不同单机环境里的,如果你要在不同单机之间传递数据,就要考虑字节序的问题,因为数据是按地址存取的,如果你是不同的字节序单机通信,就会导致传输数据”变异“,例如,把Little-endian环境的数据0x12345678的指针传递给Big-endian环境,数据就“变异”为0x78563412。
      所有网络协议也都是采用Big-endian的方式来传输数据的。所以有时我们也会把Big-endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

    【Code】

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    /*
        version: 1.0
        author: hellogiser
        blog: http://www.cnblogs.com/hellogiser
        date: 2014/7/10
    */


    /*
     big-endian: return 1
     little-endian: return 0
    */

    int checkEndianByInt()
    {
        
    int i = 0x12345678;
        
    char *c = (char *)&i;
        
    return(*c == 0x12);
    }

    /*
     big-endian: return 1
     little-endian: return 0
    */

    int checkEndianByUnion()
    {
        
    union
        {
            
    int a;// 4 bytes
            char b// 1 byte
        } u;

        u.a = 
    1;
        
    if (u.b == 1return 0;
        
    else return 1;
    }

    【参考】

    http://www.cnblogs.com/fengfenggirl/archive/2013/03/31/2992451.html

    http://www.cnblogs.com/berry/articles/1588084.html

    http://www.cnblogs.com/TsuiLei/archive/2008/10/29/1322504.html

    http://blog.csdn.net/wyzxg/article/details/5349896

    【本文链接】

    http://www.cnblogs.com/hellogiser/p/big-endian-vs-little-endian.html

    个人学习笔记,欢迎拍砖!---by hellogiser

    Author: hellogiser
    Warning: 本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,且在文章页面明显位置给出原文连接。Thanks!
    Me: 如果觉得本文对你有帮助的话,那么【推荐】给大家吧,希望今后能够为大家带来更好的技术文章!敬请【关注】
  • 相关阅读:
    数据库自动重连
    golang slice分割和append copy还是引用
    Unicode和UTF-8的关系
    golang的内置类型map的一些事
    svn sync主从同步学习
    CMake学习笔记
    常用排序总结
    优先队列实现Huffman编码
    linux 下C++查询mysql数据库
    ubuntu下C++连接mysql数据库
  • 原文地址:https://www.cnblogs.com/hellogiser/p/big-endian-vs-little-endian.html
Copyright © 2011-2022 走看看