+-
C++怎么判断大小端模式
首页 专栏 c++ 文章详情
0

C++怎么判断大小端模式

程序员杨小哥 发布于 2 月 26 日


大小端模式:

大端模式: 先存放最高有效字节,表现为最高有效字节存储在低地址 小端模式: 先存放最低有效字节,表现为最低有效字节存储在低地址

小端模式便于机器处理, 大端模式方便人阅读。

测试平台的字节序模式:

// 代码1
union test {
    int a;
    char b;
} c;

int main(int argc, char const *argv[])
{
    c.a = 1;
    cout << (c.b & 1 ? "小端" : "大端") << endl;
    return 0;
}

为什么union可以测出当前平台的字节序到底是大端还是小端呢?

union: 共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型,一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。

这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。

union变量所占用的内存长度等于最长的成员的内存长度。

// 以下程序说明联合只能对一个成员赋值,所有的变量共享这一段内存
union test {
    int a;
    char b;
} c;


int main(int argc, char const *argv[])
{
    c.a = 65;
    cout << c.a << endl;  // 输出整数65
    cout << c.b << endl;  // 输出65的ASCII码
    c.b = 66;

    cout << c.a << endl;
    cout << c.b << endl;
    return 0;
}

对于代码1,所以我们赋值 c.a = 1; 如果是小端模式,内存内 存放的应该是0x00000001, 此时c.b的值为0x01, 如果是大端模式,存放的应该是0x01000000, 此时c.b的值为0x00。

unionstruct比较

“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。

联合里面那些东西不能存放?

我们知道,联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。

类可以放入联合吗?

因为联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。

在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。

c++
阅读 42 发布于 2 月 26 日
收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
C_CPP
C/C++学习,和我一起成长哦!
关注专栏
avatar
程序员杨小哥

微信搜索:程序员杨小哥

18 声望
2 粉丝
关注作者
0 条评论
得票 时间
提交评论
avatar
程序员杨小哥

微信搜索:程序员杨小哥

18 声望
2 粉丝
关注作者
宣传栏
目录


大小端模式:

大端模式: 先存放最高有效字节,表现为最高有效字节存储在低地址 小端模式: 先存放最低有效字节,表现为最低有效字节存储在低地址

小端模式便于机器处理, 大端模式方便人阅读。

测试平台的字节序模式:

// 代码1
union test {
    int a;
    char b;
} c;

int main(int argc, char const *argv[])
{
    c.a = 1;
    cout << (c.b & 1 ? "小端" : "大端") << endl;
    return 0;
}

为什么union可以测出当前平台的字节序到底是大端还是小端呢?

union: 共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型,一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。

这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。

union变量所占用的内存长度等于最长的成员的内存长度。

// 以下程序说明联合只能对一个成员赋值,所有的变量共享这一段内存
union test {
    int a;
    char b;
} c;


int main(int argc, char const *argv[])
{
    c.a = 65;
    cout << c.a << endl;  // 输出整数65
    cout << c.b << endl;  // 输出65的ASCII码
    c.b = 66;

    cout << c.a << endl;
    cout << c.b << endl;
    return 0;
}

对于代码1,所以我们赋值 c.a = 1; 如果是小端模式,内存内 存放的应该是0x00000001, 此时c.b的值为0x01, 如果是大端模式,存放的应该是0x01000000, 此时c.b的值为0x00。

unionstruct比较

“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。

联合里面那些东西不能存放?

我们知道,联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。

类可以放入联合吗?

因为联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。

在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。