目录
大端模式
- 所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
- 例子:
- 0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
- 0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
- 在大端模式下,前32位应该这样读: e6 84 6c 4e ( 假设int占4个字节)
- 记忆方法: 地址的增长顺序与值的增长顺序相反
小端模式
- 所谓的小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
- 例子:
- 0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
- 0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
- 在小端模式下,前32位应该这样读: 4e 6c 84 e6( 假设int占4个字节)
- 记忆方法: 地址的增长顺序与值的增长顺序相同
大端序机器:数据的高位先存储;小端序机器:数据的低位先存储;
代码:
运行结果:
#include <stdio.h>
#include <stdbool.h>
#define DEBUG_TEST
enum endian
{
Big_endian, /* 0,大端序 */
Little_endian /* 1,小端序 */
};
/*********************************************************
*@function:判断一个机器是不是小端序
*@param(in):无(void)
*@return:布尔型:返回1,小段序;返回0,大端序;
*******************************************************/
#ifndef UNION_ENDIAN
bool isLittle_endian(void)
{
unsigned int word = 0x12345678;
unsigned char byte0 = *((unsigned char *)&word + 0);
#ifndef DEBUG_TEST
unsigned char byte1 = *((unsigned char *)&word + 1);
unsigned char byte2 = *((unsigned char *)&word + 2);
unsigned char byte3 = *((unsigned char *)&word + 3);
unsigned int *Pint = &word;
unsigned char *Pchar0 = &byte0;
unsigned char *Pchar1 = &byte1;
unsigned char *Pchar2 = &byte2;
unsigned char *Pchar3 = &byte3;
printf("%p : word = 0x%x\n",Pint,word);
printf("%p : byte0 = 0x%x\n",Pchar0,byte0);
printf("%p : byte1 = 0x%x\n",Pchar1,byte1);
printf("%p : byte2 = 0x%x\n",Pchar2,byte2);
printf("%p : byte3 = 0x%x\n",Pchar3,byte3);
#endif
if(byte0 == 0x78)
{
//printf("little endian\n ");
return (Little_endian);
}
else
{
//printf("big endian\n");
return (Big_endian);
}
}
#else
bool isLittle_endian(void)
{
union A
{
unsigned int word;
unsigned char byte;
};
union A un;
un.word = 0x12345678;
if(un.byte == 0x78)
{
return (Little_endian);
}
else
{
return (Big_endian);
}
}
#endif
#ifdef DEBUG_TEST
int main(void)
{
bool ret;
ret = isLittle_endian();
if(ret == 0)
{
printf("ret = %d , big endian machine\n",ret);
}
else
{
printf("ret = %d ,little endian machine\n",ret);
}
return 0;
}
#endif