字符混淆中的转义序列

Escape sequence in char confusion

本文关键字:转义序列 字符      更新时间:2023-10-16

我在这里遇到了这个例子.

#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-endiann";
    else
        std::cout << "This system is big-endiann";
}

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

内存中(32 位)整数的布局为;

Big endian:
+-----+-----+-----+-----+
|  0  |  0  |  0  |  7  |
+-----+-----+-----+-----+
   ^ pointer to int points here
Little endian:
+-----+-----+-----+-----+
|  7  |  0  |  0  |  0  |
+-----+-----+-----+-----+
   ^ pointer to int points here

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

十六

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

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

一个小端系统将以"相反"的顺序存储值的字节,下半部分在前

07 00 00 00

大端系统将首先存储"大"端

00 00 00 07

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

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

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