大小端问题

作者: rmrfany | 来源:发表于2019-01-11 10:42 被阅读6次

    一、定义

    大端模式:
    大端模式就是指把数据的高字节保存在内存的低地址中,数据的低字节保存在内存的高地址中,这和我们一般的阅读顺序是一致的。

    小端模式:
    小端模式与大端模式相反,数据的高字节位置保存在内存的高地址处,数据的低字节保存在内存的低地址处。这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

    图解
    画张图简单解释下大小端的区别,比如我们要存取一个0x12345678的数据,在大小端机器的存取方式分别是:

    20171118130422005.png

    二、判断机器大小端方式

    字符指针判断
    在32位平台下,int占4个字节,而char类型的指针是占一个字节的,如果我们把int强传为char类型的指针,只会保存第一个字节的数据,那么我们只需要判断char里面的第字节和int里面的第一个字节是否是一致即可判断。
    如果一致则为小端模式,反之为大端模式。

    
    #include <iostream>
    using namespace std;
    int main()
    {
        int a = 1;
        //0x00 00 00 01    大端存储方式
        //0x01 00 00 00    小端存储方式
        //char 只存一个字节
        //大端 0x00      == 0
        //小端 0x01      == 1  
        if (*(char*)&a == 1)    
            cout << "小端模式" << endl;
        else
            cout << "大端模式" << endl;
        return 0;
    }
    

    大端转换成小端模式:

    32位:

    #define swap32Big2Little(x)    (   ( (x)&(0x0000ffff) ) << 32 | ( (x)&(0xffff0000) >> 32   )
    

    64位:

    #define swap64Big2Little(x)    (   ( (x)&(0x00000000ffffffff) ) >> 64 |  ( (x)&(0xffffffff00000000) >>64  )
    

    相关文章

      网友评论

        本文标题:大小端问题

        本文链接:https://www.haomeiwen.com/subject/lfvtdqtx.html