Linux学习-通信-字节序

本文主要介绍字节序相关知识。首先阐述字节序概念,即字节在电脑中存放与输入输出时的先后顺序。接着介绍常见字节序,如小端、大端和网络字节序。还给出大小端存储实例,并介绍两种判断大小端的方法,包括字符指针判断和联合体判断。

字节序

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值