字符混淆中的转义序列

Escape sequence in char confusion

我遇到了这个例子here .

#include <iostream>

int main()
{
    int i = 7;

    char* p = reinterpret_cast<char*>(&i);
    if(p[0] == '\x7') //POINT OF INTEREST
        std::cout << "This system is little-endian\n";
    else
        std::cout << "This system is big-endian\n";
}

我感到困惑的是 if 语句。转义序列在这里如何表现?我得到与 p[0] == '' 相同的结果(\x 是十六进制转义序列)。如何检查 p[0] == '\x7' 是否告诉我系统是小端还是大端?

十六进制 7 和八进制 7 恰好是相同的值,十进制 7 也是如此。

该检查旨在尝试确定该值是在 int 的第一个字节还是最后一个字节中结束。

小端系统将按 "reverse" 顺序存储值的字节,低位在前

07 00 00 00

大端系统会先存储 "big" 结尾

00 00 00 07

通过读取第一个字节,代码将查看 7 是否在那里结束。

十进制的 7 与十六进制的 7 和八进制的 7 相同,因此使用 '\x7''' 甚至只是 7 都没有关系(数字字面量,而不是字符)。

至于字节顺序测试:i 的值为 7,这意味着它将在其最低有效字节中包含数字 7,在所有其他字节中包含数字 0。转换 char* p = reinterpret_cast<char*>(&i); 使 p 指向 i 表示中的 第一个 字节。然后测试检查该字节的值是否为 7。如果是,则它是最低有效字节,暗示 little-endian 系统。如果该值不是 7,则它不是 little-endian 系统。代码假设它是一个 big-endian,虽然这不是严格建立的(我相信也有一些具有某种混合字节顺序的奇异系统,尽管代码在实践中可能不会 运行)。

一个(32位)整数在内存中的布局是;

Big endian:

+-----+-----+-----+-----+
|  0  |  0  |  0  |  7  |
+-----+-----+-----+-----+
   ^ pointer to int points here

Little endian:

+-----+-----+-----+-----+
|  7  |  0  |  0  |  0  |
+-----+-----+-----+-----+
   ^ pointer to int points here

代码基本上做的是读取整数指针指向的第一个 char,在小端的情况下是 \x0,大端是 \x7.