大端模式(Big Endian)和小端模式(Little Endian)是用于描述多字节数据在内存中存储顺序的两种方式。
大端模式(Big Endian):
在大端模式下,多字节数据的高位字节存储在低地址,低位字节存储在高地址。也就是说,数据的字节顺序与内存地址的增长方向相反。例如,对于一个 4 字节的整数值0x12345678,它在内存中的存储顺序如下:地址: 0x1000 0x1001 0x1002 0x1003 数据: 0x12 0x34 0x56 0x78
小端模式(Little Endian):
在小端模式下,多字节数据的低位字节存储在低地址,高位字节存储在高地址。也就是说,数据的字节顺序与内存地址的增长方向相同。例如,对于同样的 4 字节整数值0x12345678,在小端模式下它在内存中的存储顺序如下:地址: 0x1000 0x1001 0x1002 0x1003 数据: 0x78 0x56 0x34 0x12
在计算机系统中,大端模式和小端模式的选择是由处理器架构和操作系统决定的。x86 架构的处理器一般采用小端模式(c语言就是小端模式),而一些其他架构如 PowerPC、ARM 等可以采用大端或小端模式,具体取决于硬件和操作系统的配置。
使用32位编译情况下,给出判断所使用机器大小端的方法:
法一:
联合体方法判断方法:利用union结构体的从低地址开始存,且同一时间内只有一个成员占有内存的特性。大端储存符合阅读习惯。联合体占用内存是最大的那个,和结构体不一样。a和c公用同一片内存区域,所以更改c,必然会影响a的数据
#include<stdio.h>
int main(){
union w
{
int a;
char b;
}c;
c.a = 1;
if(c.b == 1)
printf("小端存储\n");
else
printf("大端存储\n");
return 0;
}
法二:
指针方法:通过将int强制类型转换成char单字节,p指向a的起始字节(低字节)
#include <stdio.h>
int main ()
{
int a = 1;
char *p = (char *)&a;
if(*p == 1)
{
printf("小端存储\n");
}
else
{
printf("大端存储\n");
}
return 0;
}