字符混淆中的转义序列
Escape sequence in char confusion
我在这里遇到了这个例子.
#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,则不是小端系统。代码假设它是一个大端序,尽管它没有严格建立(我相信也有具有某种混合字节序的奇特系统,尽管代码在实践中可能不会在这样的设备上运行)。
相关文章:
- 如何在C++中用'\'替换''来处理转义序列?
- 是否可以在原始字符串文本中插入转义序列?
- 使用无法适应其相关类型的转义序列
- C++二进制值的转义序列
- 使变量字符串忽略转义序列
- "Delete"的转义序列
- getchar() 避免转义序列
- GCC 编译时出现警告:未知转义序列:"\040"
- C++ 中转义序列的数据类型
- 如何在 QString 中解析转义序列
- 如何在C++中转义白色字符
- "'"转义序列的目的是什么?
- C++正则表达式转义标点字符,如"."
- 如何转义整个字符序列?
- C++ 无法识别的转义序列
- lex 中 OR ( | ) 的转义序列
- 如何将字母字符转换为相应的转义特殊字符
- 转义序列?在 Qstring 中使用引号
- 字符混淆中的转义序列
- 将带有显式转义序列的字符串转换为相对字符