这篇博客是对于我个人的知识的复习,当然如果有某位大佬能够指出这里面有哪些概念含糊不清或者难懂,麻烦指出来感激不尽。
关于大端小端的概念
- 小端:数据的高位字节存放在高地址内,数据的低位字节存放在低地址内。
- 大端:数据的高位字节存放在低地址内,数据的低位字节存放在高地址内
目前有两种方法判断机器的大小端
- int变量的地址强转为char*的指针,最后用指针取值得到的就是低地址的值
#include<stdio.h>
int main()
{
test.a = 0x12345678;
char* m = (char*)&i;
if (*m = 0x78)
printf("是小端");
}
- 利用联合体的特性,各成员共享同一段内存空间,一个联合体的长度为最长成员长度。
#include<stdio.h>
union mm
{
int a;
char c;
}test;
int main()
{
test.a = 0x12345678;
//char* m = (char*)&i;
//if (*m = 0x78)
// printf("是小端");
if (test.c = 0x78)
printf("是小端");
}
上面的基本在大一时的老师就会讲了,我们的重点不是上面,而是为什么要有大小端之分?将所有的高位字节存放在高地址,低位字节放在低地址就行了?
因为在计算机中是以字节为基本单位的,除了1字节的char类型,4字节的int,8字节(某些系统)的long类型,而且对于大于8位的寄存器,例如32位或者64位,就产生了如何将多个字节按顺序进行安排?也就有了大端储存模式和小端储存模式。
常见的X86结构是小端模式,ARM,DSP也是小端模式,某些ARM可以自己选择硬件的大小端模式。