存储器有两种映射机制,大端存储(big-endian)和小端存储(little-endian)。
以32bit machine,int型数据为例:
1.小端存储(little-endian)
数据的最低位字节被看做是最低位字节,最高位字节被看做是最高位字节。
2. 大端存储(big-endian)
数据的最高位字节保存在最低地址字节,最低位字节保存在最高地址字节。
记忆:简单讲,正常存储的为大端模式,反向存储的为小端模式;
Q1: 如何使用程序判定机器的大小端?
1)利用联合体来判断:
//使用联合体来判断,利用联合体可以在相同的存储空间储存不同的数据类型(不是同时存储)的性质,进行大小端的判断;
typedef union
{
int i;
char c;
}my_union;
int main(void)
{
my_union u;
u.i=1;
printf("the result is %d",u.c); //注意:char 类型占位符为%c, 字符串占位符为%s;
return 0; //result is 1,说明存储方式为小端模式
}
/*
//相关知识点总结
联合体声明:
union hold //注意:联合体一个时间点只能储存一个值;
{
int digit;
double bigfl;
char letter;
};
联合体相关定义:
union hold fit; //定义一个hold 类型的联合变量;
union hold save[10]; //定义一个内含10个该类型联合变量的数组;
union hold *pu; //定义一个指向hold类型联合变量的指针;
联合体赋值:
fit.digit=23; 把23储存在fit,占4个字节;
fit.bigfl=2.0; 清除23,把2.0储存在bigfl,占8个字节;
fit.letter='h'; 清除2.0,存储'h',占一个字节;
*/
2. 可以使用强制转换符来判断机器的大小端;
// 将Int类型强制转换为char类型,
#include <stdio.h>
int main(void)
{
int a=1;
if((char)a&a == 1)
printf("little-end"); //result is lettle-end
else
printf("big-end");
return 0;
}
/*
强制转换类型:
mice = (int)1.6 + (int)1.7;
*/