数组在内存中的存储地址:
数据在内存中的两种存储形式:
小端:低地址放小数据(数据在内存/PC中以小端的形式储存,x86系统下)
大段:低地址放大数据(unix,网络字节序)
Eg:
eg:写程序检测当前系统的大小端模式:
1.用移位法:
#include<stdio.h>
int main()
{
unsigned int a=1;
a>>=8?printf("big\n"):printf("little"); //little
return 0;
}
运行结果:
大小端模式就是位的问题,所以用位移法表明你真正理解了本质。变量右移8(因为a = 1,变成二进制为:0000 0001 所以其实右移一位就可以判断了。)左边不够补0。所以就可以判断了,如果1存放在高位,右移8位后1还是存在的;如果1存放在低位,右移8位后1将被移出数据,所以不存,结果为0。
地址: 高地址 <<====== 低地址
小端模式存放:0000 0001 >> 8 == 0000 0000
大端模式存放:1000 0000 >> 8 == 0000 1000
2.强转数据类型:
#include<stdio.h>
int main()
{
unsigned int a=1;
char ch=(char)a;
(ch)?printf("little\n"):printf("big\n"); //little
return 0;
}
数据类型强制转换,其实本质还是取低8位数来判断。分析同上:a = 1 ,变成二进制为:0000 0001.强转为char时,保留unsigned int a变量的低8位。所以这样就更加明了了。因为1低位数据,如果char c不为0,表明1存放在低位,即是小端模式;如果char c变量为0,表明1存放在高位,即是大端模式。
3.共用体:
#include<stdio.h>
typedef union
{
int a;
char c;
}test;
int main()
{
test t;
t.a=1;
(t.c)?printf("little\n"):printf("big\n"); //little
return 0;
}
共用体里面的成员共用一个内存空间,而且是从低位开始占用,共用体变量的内存空间大小是该变量中某个占用空间最大的那个成员所占的空间。比如上面的结构体变量的空间就是int a占空间的大小,char c是从低位开始占用,也就是占用int a的低8位。so,解释同第二种方法