下面是一个简单的字节序测试示例,可以用来检查当前计算机的字节序:
(本人所写的所有博客知识点示例均可上机测试,需要可以收藏)
#include <iostream>
int main() {
uint32_t num = 0x12345678;
uint8_t* ptr = reinterpret_cast<uint8_t*>(&num);
if (*ptr == 0x78) {
std::cout << "Little Endian" << std::endl;
} else if (*ptr == 0x12) {
std::cout << "Big Endian" << std::endl;
} else {
std::cerr << "Unknown byte order" << std::endl;
}
return 0;
}
这个程序首先定义了一个 32 位整数 num
,它的值为 0x12345678
。然后使用 reinterpret_cast
将 num
的地址转换为指向 uint8_t
类型的指针 ptr
,这样就可以按字节访问 num
中的内容了。
接着,判断 *ptr
的值,如果为 0x78
,说明当前计算机是小端字节序;如果为 0x12
,说明当前计算机是大端字节序。如果都不是,就输出一个错误信息,表示无法判断当前计算机的字节序。
如果你对字节序不是特别清晰,请接着往下看示例
假设我们有一个 32 位整数,它的十六进制表示为 0x12345678
,在内存中的存储方式取决于所使用的计算机的字节序。
如果是小端字节序的计算机,在内存中,这个整数的低位字节会被存储在低地址处,也就是 0x78
存放在第一个字节的位置,高位字节则存放在高地址处。因此,在内存中,这个整数会被存储为:
地址: 0x1000 0x1001 0x1002 0x1003
内容: 0x78 0x56 0x34 0x12
而如果是大端字节序的计算机,在内存中,这个整数的高位字节会被存储在低地址处,低位字节则存放在高地址处。因此,在内存中,这个整数会被存储为:
地址: 0x1000 0x1001 0x1002 0x1003
内容: 0x12 0x34 0x56 0x78
这里需要注意的是,这个整数本身并没有发生变化,只是在不同的计算机上以不同的字节序存储而已。