不使用库函数如何判断系统的大小端
方法一:使用联合体
#include <cstdint>
#include <stdio.h>
int main() {
union {
uint32_t i;
char c[4];
} u;
u.i = 0x1234; // 先声明联合体,再赋值
if (u.c[0] == 0x12) {
printf("Big-endian\n");
} else if (u.c[0] == 0x34) {
printf("Little-endian\n");
} else {
printf("Unknown\n");
}
return 0;
}
方法二:使用指针转换
#include <stdio.h>
int main() {
unsigned int x = 0x1234;
if (*(char *)&x == 0x34) {
printf("Little-endian\n");
} else {
printf("Big-endian\n");
}
return 0;
}
方法三:数组
#include <stdio.h>
int main() {
unsigned int x = 0x1234; // 定义一个 unsigned int 类型的变量,值为 0x1234
char *c = (char *)&x; // 将 x 的地址转换为 char * 类型的指针
// 检查第一个字节
if (c[0] == 0x34) {
printf("Little-endian\n"); // 如果第一个字节是 0x34,则系统是小端模式
} else if (c[3] == 0x34) {
printf("Big-endian\n"); // 如果最后一个字节是 0x34,则系统是大端模式
} else {
printf("Unknown\n"); // 其他情况(理论上不会出现)
}
return 0;
}
无论使用什么方式,其核心思想都是利用char* 来访问一个大于一个字节类型的值,访问到的是第一个字节即是大端,最后一个字节就是小端。