一、什么是大小端?
大端模式:低位字节存在高地址,高位字节存在低地址
小端模式:高位字节存在高地址,低位字节存在第地址
二、如何判断计算机处理器是大端还是小端?
①使用变量 x
的值本身来检查处理器存储是大端还是小端的。因为不同的字节序列在内存中表示相同的无符号整数,所以可以使用这种方法来判断处理器的存储顺序。如果 x
的值等于 0x78563412
,则说明处理器存储是大端的,否则就是小端的。最后,它输出相应的消息并返回0。
#include <stdio.h>
int main() {
unsigned int x = 0x12345678;
if (x == 0x78563412) {
printf("Big endian\n");
} else {
printf("Little endian\n");
}
return 0;
}
②该代码定义了一个无符号整数变量 x
,并将其初始化为 0x12345678
。然后,它创建了一个指向 x
的字符指针 p
,并将其强制转换为指向字符类型的指针。接下来,它检查指针 p
指向的第一个字节是否为 0x78
。如果是,则说明处理器存储是小端的,否则就是大端的。最后,它输出相应的消息并返回0。
#include <stdio.h>
int main() {
unsigned int x = 0x12345678;
char *p = (char*) &x;
if (*p == 0x78) {
printf("Little endian\n");
} else {
printf("Big endian\n");
}
return 0;
}
③该代码使用了一个联合体(union),其中包含一个无符号整数变量 x
和一个字符数组 bytes
。在初始化 x
之后,它检查 bytes
的第一个元素是否为 0x78
。如果是,则说明处理器存储是小端的,否则就是大端的。最后,它输出相应的消息并返回0。
联合体(union)在内存中占用一块空间,而这块空间的大小足够大能够容纳所有成员变量。在联合体中,所有的成员变量共享同一块内存空间,因此它们在内存中的位置是重叠的。这也是为什么我们可以使用联合体来检查一个变量的字节序列,从而判断处理器的存储顺序是大端还是小端。
#include <stdio.h>
typedef union {
unsigned int x;
char bytes[4];
} Union;
int main() {
Union u;
u.x = 0x12345678;
if (u.bytes[0] == 0x78) {
printf("Little endian\n");
} else {
printf("Big endian\n");
}
return 0;
}