什么是大小端?
大小端又被成为 大端字节序 和 小端字节序 。大小端其实指的就是在数据如何存到内存中的方式。
接下来 来看一个数据 0x12345678 在不同模式下的存储方式:
在 VS 的编译环境下:
可以清晰的看到 a 在内存中的存储情况。a 的高位字节 0x12 存在了内存 0x00B1FE57,
而低位字节 0x78 存在了内存 0x00B1FE54;
故在此环境下内存的存储方式是 小端存储 ,同理大端字节序存储方式也是类似的。
那么如何记忆呢?
1. 大端不变小端变(内存从低到高,大端存储数据和原数据一样放入;小端则倒序放入)
2. 低字节存低地址是小端;低字节存高地址是大端
如何写一个程序判断当前环境是大端还是小端存储方式?
首先已经知道了数据在内存中存储的方式。为了方便计算取数字 1 来举例。
内存低地址-------------------->内存高地址
在 大端中 0x 00 00 00 01
在 小端中 0x 01 00 00 00
所以只要写一个程序能够取出数据的第一个字节,如果取出的是 1 说明是小端;0 则是大端
下面提供两种方法:
//方法一: 用 char* 访问一个字节的方法
int main()
{int a = 1;char* p = (char*)&a;if (*p == 1)printf("小端\n");elseprintf("大端\n");return 0;
}//方法二: 用 联合体 共用一块空间的方法
union
{char c;int i;
}un;
int main()
{int a = 1;un.i = 1;if (un.c == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
再将上面两种方法封装一下,封装成判断大小端函数。
//返回1是小端 返回0是大端
int check1()
{int a = 1;return *(char*)&a;
}int check2()
{union{char c;int i;}un;un.i = 1;return un.c;
}int main()
{int ret = check1();if(ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
以上就是判断大小端的方法,当有两个字节以上数据才会有大小端的排序。
本文链接:https://my.lmcjl.com/post/10306.html
展开阅读全文
4 评论