大端模式:字的高位字节–>低位地址单元,字的低位字节–>高位地址单元中(大端高对低)
小端模式:字的高位字节–>高位地址单元,字的低位字节–>低位地址单元中(小端高对高)
大端模式:
(该图是借用某位网友的)
判断代码如下:
/*
time:2020年9月10日20:01:17
objective:判断内存中存储数据的两种分布方式
author:wujunwu
*/
#include<stdio.h>
//方法一 :数据类型强制转换法
int func(void)
{
int a=1; //0x00000001,这里的1属于字的低位
char b=*((char *)(&a)); //char类型的指针指向变量a的低地址
/*char类型是1个字节,这里只能用指针强制转换,
不能用char b=char a;这样是错误的*/
return b;
}
/*如果内存存储是大端模式,将int类型的变量a强制转换成char类型
并赋值给变量b,此时的变量b等于0,而不是1;如果内存存储是
小端模式,此时的变量b等于1
*/
//主函数
int main (void)
{
int i=0; //内存清0
i=func(); //将一个字节的b=1存入i变量(int是4字节)内存中
if(1==i)
{
printf("little ending\n");
}
else
printf("big ending\n");
return 0;
}
//方法二:共用体法
union end
{
int a;
char b;
}u1;
int func(void)
{
u1.a=1; //这里不能写成u1->a
// u1.b=u1.a; 在这里也可以加上该代码,但是没必要,我们可以省略它
return u1.b; //为什么这里可以直接返回一个u1.b呢?
// 因为共同体union end u1的内存大小是4字节,a和b数据共用这4字节 。
}
int main (void)
{
int i=0;
i=func();
if(1==i)
{
printf("little ending\n");
}
else
printf("big ending\n");
return 0;
}
/*time:2021年2月3日18:03:14
objective:增加新的判断方式
author:吴军武
*/
/*
//方法三:数据类型强制转换法
#include<stdio.h>
typedef unsigned int u32;
typedef unsigned char u8;
int main(void)
{
u32 value1=0x11223344;
u8 value2=*((u32*)(&value1));
//u8 *value2=u8(&value1);
u8 test =value2;
if(test == 0x11)
{
printf("big ending\n");
}
if(test == 0x44)
{
printf("little ending\n");
}
return 0;
}
*/
//方法四:共用体法
#include<stdio.h>
typedef union
{
unsigned short a;
unsigned char ptr[2];
}test;
int main(void)
{
test value;
value.a=0x1144;
if(value.ptr[0]==0x11&&value.ptr[1]==0x44)
{
printf("big ending\n");
}
else if(value.ptr[0]==0x44&&value.ptr[1]==0x11)
{
printf("little ending\n");
}
else
printf("use memory error\n");
return 0;
}
输出结果是:
little end model
说明我使用的Ubuntu(Linux)系统的内存存储方式是小端模式。