zoukankan      html  css  js  c++  java
  • c语言那些细节之littleendian和bigendian


            知道大小端,但是都没有整理下,只知道网络要用到big-endian,也就是大端模式。

    在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-EndianLittle-Endian

            以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value

    Big-Endian: 低地址存放高位,如下图:

    栈底 (高地址)

    ---------------

    buf[3] (0x78) -- 低位

    buf[2] (0x56)

    buf[1] (0x34)

    buf[0] (0x12) -- 高位

    ---------------

    栈顶 (低地址)

    Little-Endian: 低地址存放低位,如下图:

    栈底 (高地址)

    ---------------

    buf[3] (0x12) -- 高位

    buf[2] (0x34)

    buf[1] (0x56)

    buf[0] (0x78) -- 低位

    --------------

    栈顶 (低地址)

    Big-Endian 优点: 靠首先提取高位字节,你总是可以由看看在偏移位置为0的字节来确定这个数字是正数还是负数。你不必知道这个数值有多长,或者你也不必过一些字节来看这个数值是否含有符号位。这个数值是以它们被打印出来的顺序存放的,所以从二进制到十进制的函数特别有效。因而,对于不同要求的机器,在设计存取方式时就会不同。

    Little-Endian 优点: 提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对一的关系,多重精度的数学函数就相对地容易写了。

    如何检查处理器是 Big-Endian 还是 Little-Endian?

    由于联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。例如:

    #include <stdio.h>
    int checkCPUendian()
    {
        union 
        {
            unsigned int a;
            unsigned char b;            
        }c;
        c.a = 1;
        return (c.b == 1);      
    }   /*return 1 : little-endian, return 0:big-endian*/
    int main()
    {
        checkCPUendian() ? printf("Little-endian\n"):printf("Big-endian\n");
        return 0;
    }

    或者最直接的:

    #include <stdio.h>
    int main()
    {
        short int x;
        char x0,x1;
        x = 0x1122;
        x0 = ((char*)&x)[0]; //低地址单元
        x1 = ((char*)&x)[1]; //高地址单元
        if(x0 == 0x11)
            printf("Big-endian\n");
        else
     	printf("Little-endian\n");
        return 0;
    }
    


  • 相关阅读:
    第009题 智猜年龄——问经理三女儿年龄各多少
    第008题 求最大值——10个1加乘的最大数字
    第007题 天平称物——最少砝码称出最多质量
    第006题 天平找次——至少称几次找到次品
    第005题 青蛙过河——十只青蛙如何顺利过去
    第004题 过河问题——如何过河用时最短
    第003题 过河问题——三对老虎如何安全过河
    第002题 打水问题——9升和4L的桶如何打6升水
    基于博弈论分析在线教育网站和慕课的产生
    C++左右括号匹配问题(并给出括号的位置 并且允许非括号字符插入)修改版
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300013.html
Copyright © 2011-2022 走看看