字符混淆中的转义序列
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
.
我遇到了这个例子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
.