我遇到了这个例子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] == '\07'
相同的结果(\x
是十六进制转义序列)。如何检查p[0] == '\x7'
是否告诉我系统是小端还是大端?
答案 0 :(得分:3)
十六进制7和八进制7恰好是相同的值,小数点为7。
该检查旨在确定该值是否以int
的第一个或最后一个字节结束。
一个小端系统会将值的字节存储在&#34;反向&#34;订单,首先是下半部分
07 00 00 00
大端系统将存储&#34;大&#34;先结束
00 00 00 07
通过读取第一个字节,代码将查看7是否在那里结束。
答案 1 :(得分:3)
内存中(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
。
答案 2 :(得分:1)
十进制中的7与十六进制中的7和八进制中的7相同,因此如果您使用'\x7'
,'\07'
,甚至只是7
,则无关紧要(数字文字,而不是字符)。
对于字节序测试:i
的值为7,意味着它在最低有效字节中的数字为7,在所有其他字节中为0。强制转换char* p = reinterpret_cast<char*>(&i);
使p
指向i
表示中的第一个字节。然后测试检查该字节的值是否为7.如果是,则它是最不重要的字节,暗示一个小端系统。如果该值不是7,则它不是小端系统。该代码假设它是一个大端,虽然它没有严格建立(我相信有一些具有某种混合字节序的异域系统,尽管代码可能不会在实践中运行)