关于c++:C怎么判断大小端模式

32次阅读

共计 1043 个字符,预计需要花费 3 分钟才能阅读完成。


大小端模式:

  • 大端模式: 先寄存最高无效字节,体现为最高无效字节存储在低地址
  • 小端模式: 先寄存最低无效字节,体现为最低无效字节存储在低地址

小端模式便于机器解决, 大端模式不便人浏览。

测试平台的字节序模式:

// 代码 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 比拟

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


  1. 联结外面那些货色不能寄存?

咱们晓得,联结外面的货色共享内存,所以动态、援用都不能用,因为他们不可能共享内存。

  1. 类能够放入联结吗?

因为联结里不容许寄存带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无奈保障这些对象不被毁坏,也无奈保障来到时调用析够函数。

在 C ++ 中应用 union 时,尽量放弃 C 语言中应用 union 的格调,尽量不要让 union 带有对象。

正文完
 0