字节序
1. 概念
字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。
2. 常见字节序
Little endian(小端字节序):将低序字节存储在起始地址
Big endian(大端字节序):将高序字节存储在起始地址
网络字节序:相当于大端字节序
3. 大小端储存实例
假设一个32位 unsigned int型数据0x12 34 56 78,
0x12 34 56 78类比工资¥12 34 56 78 ,12代表的数值金额比78 大 12就是高字节,78就是低字节

大端存储方式为 0x12 34 56 78(低地址存高字节)
小端存储方式为 0x78 56 34 12(低地址存低字节)
4.大小端判断
①字符指针判断
在32位平台下,int占4个字节,而char类型的指针是占一个字节的,如果我们把int强传为char类型的指针,只会保存一个字节的数据,那么我们只需要判断char里面的第一个字节和int里面的第一个字节是否是一致即可判断。
如果一致则为小端模式,反之为大端模式。
注:
下面代码我们令 int a=1 如果是小端模式,int下1会存放在在低地址处,而强传为char类型的指针,1也在低地址处,所以可以判断。
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int num = 1;
if(*(char*)&num ==1)
{
printf("小端字节序\n");
}
else
{
printf("大端字节序\n");
}
return 0;
}
②联合体判断
由于联合体所有数据共享一块地址空间,存放数据的所有成员都是从低地址开始存放,所以我们可以在联合体内定义一个int和一个char类型变量,然后在外部实例化的时候创建int变量,用char变量调用,相当于隐式类型转化,如果结果为1,则低字节存放在低地址,既是小端机器,反之大端机器。
//联合体union的存放顺序是从低地址开始存放的
include <iostream>
using namespace std;
union Test
{
int a;
char b;
};
int main()
{
Test t;
t.a = 1;
if (t.b == 1)
{
printf("小端字节序\n");
}
else
{
printf("大端字节序\n");
}
return 0;
}
本文主要介绍字节序相关知识。首先阐述字节序概念,即字节在电脑中存放与输入输出时的先后顺序。接着介绍常见字节序,如小端、大端和网络字节序。还给出大小端存储实例,并介绍两种判断大小端的方法,包括字符指针判断和联合体判断。
1287

被折叠的 条评论
为什么被折叠?



