C/C++字节序(大端/小端)判断

简介: C/C++大端小端判断说的是变量的高字节、低字节在内存地址中的排放顺序。变量的高字节放到内存的低地址中(变量的低字节放到内存的高地址中)==>大端变量的高字节放到内存的高地址中(变量的低字节放到内存的低地址中)==>小端例如,对于int类型变量x=0x30313233,在x86下,考虑到在内...

C/C++大端小端判断

说的是变量的高字节、低字节在内存地址中的排放顺序。

变量的高字节放到内存的低地址中(变量的低字节放到内存的高地址中)==>大端
变量的高字节放到内存的高地址中(变量的低字节放到内存的低地址中)==>小端

例如,对于int类型变量x=0x30313233,在x86下,考虑到在内存中是按照字节为单位进行数据排布,那么会把0x30,0x31,0x32,0x33这4个值按照某种顺序(大端或者小端)进行存储:从0x30到0x33依次为变量的高字节到低字节,如果是大端字节序存储,则从低内存地址到高内存地址,依次存放:0x30, 0x31, 0x32, 0x33;如果是小端字节序存储,则从低内存地址到高内存地址,依次存放:0x33, 0x32, 0x31, 0x30(用这几个蛋疼的16进制数字,是为了后续强转为char类型并打印的方便而考虑的):

img_116e836b7bb40949b8ef82a7570eed78.png

写个代码验证下:

void test_little_or_big_endian() {
    int x;
    cout << "sizeof(int) is " << sizeof(int) << endl;
    char x0, x1, x2, x3;
    x = 0x30313233;
    cout << *((char*)&x) << endl;
    x0 = ((char*)&x)[0];
    x1 = ((char*)&x)[1];
    x2 = ((char*)&x)[2];
    x3 = ((char*)&x)[3];


    cout << "x0=" << x0 << endl;
    cout << "x1=" << x1 << endl;
    cout << "x2=" << x2 << endl;
    cout << "x3=" << x3 << endl;
    /*
    对于小端序,输出
    x0=3   
    x1=2
    x2=1
    x3=0   //0x30对应到十进制的48,也即是ascii的'0',作为char类型输出显示为0
    */
}
目录
相关文章
|
存储 C++ 网络协议
|
21天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4
|
21天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
19 4
|
21天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
17 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
51 1
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
18 1
|
1月前
|
C++
C++番外篇——日期类的实现
C++番外篇——日期类的实现
76 1