数据在内存中的存储【C语言版】
目录
1.举例:
2.深入刨析大端小端的组成:
3.判断当前编译环境是大端还是小端的方法
4.以函数的形式来判断当前的编译环境是大端还是小端【就是把判断大端小端的方法放进函数里面来实现,得到返回值,可以减少main()函数的内存】
数据在内存中的字节序存储有两种方式:一种是大端存储,另一种是小端存储。
决定数据在内存中的字节序存储方式的因素是当前编译器的环境【★★★★★】。
小端字节序存储:一个数据的低位字节的数据存放在内存的低地址处,高位字节的数据存放在内存的高地址处。【小端的数据举例:0x78563412=12 34 56 78】
大端字节序存储:一个数据的低位字节的数据存放在内存的高地址处,高位地址的数据存放在内存的低地址处。【大端的数据举例:0x78563412=78 56 34 12】
1.举例:
#include<stdio.h>
int main() {
int a = 0x11223344;//当前的环境下数据是以小端的形式存放的,即:0x11223344=44 33 22 11;
int b = 0x21;//小端存放,即:0x01=01 00 00 00;
char* p =(char*) & b;//拿出来的是b的四个字节【这个是先取出对应地址,再强制类型转换】中,地址较小的那个字节的地址
for (int i = 0; i < 4; i++) {
printf("%0x\n",*(p+i));//%0x输出的是十六进制形式的整型
}
return 0;
}
运行结果:
2.深入刨析大端小端的组成:
#include<stdio.h>
int main() {
int a = 10005;//a在内存中的存储形式是:15 27 00 00【5是个位,1是十位,7是百位,2是千位】
//(⚠★★★★★这个中的15是指十位是1,个位是5,与个位的15是F不能混为一谈)
char* p = (char*)&a;
for (int i = 0; i < 4; i++) {
printf("%d\n", *(p + i));
}//a=10005(十进制)=2715(十六进制)
return 0;
}
运行结果:
图示:
3.判断当前编译环境是大端还是小端的方法
#include<stdio.h>
int main() {
int a = 5;
char* p = (char*)&a;
printf("%d\n", *p);//直接看它的第一个字节输出的是什么,如果是0,说明是大端;如果是5,说明是小端
if (*(char*)&a == 5) {
printf("数据在内存中是以小端形式存放\n");
}
else
printf("数据在内存中是以大端形式存放\n");
return 0;
}
运行结果:
4.以函数的形式来判断当前的编译环境是大端还是小端【就是把判断大端小端的方法放进函数里面来实现,得到返回值,可以减少main()函数的内存】
#include<stdio.h>
int if_duan(int a) {//这个里面的形式参数可以设置成任何变量,和实际参数不一样也行,均不影响
return *(char*)&a == 5;
}
int main() {
int a = 5;
int ret=if_duan(a);
if (ret = 1) {
printf("数据在当前编译环境下是小端形式存储\n");
}
else
printf("数据在当前编译环境下是大端形式存储\n");
return 0;
}
运行结果: