理解小端大端存储模式

理解小端大端存储模式


小端大端参考文章


1. 大端模式和小端模式

/*
    字节序 -> 多字节数据在内存中的存储顺序, 分为 大端模式 和 小端模式 两种存储方法
    
    小端模式 -> 高字节数据存储在高地址       速记: 小 (小端) 高 (高字节) 高 (高地址)
    
    大端模式 -> 高字节数据存储在低地址     
*/

大小端存储方式

/*
    举个例子:
    
    对于 32位整型数据 0x12345678, 它在大端和小端两种模式下是这样存储的:
    
            低地址  --------->  高地址
    小端:     0x78  0x56  0x34  0x12
    
    大端:     0x12  0x34  0x56  0x78
*/

2. 主机字节序和网络字节序

/*
    主机字节序:
    
    不同的主机有不同的字节序, 如 x86为小端模式, Motorla 6800为大端模式
*/
/*
    网络字节序:
    
    TCP/IP中规定好的一种数据表示格式, 它与具体的 CPU类型操作系统等无关, 从而保证数据在不同主机之间传输时能够被正确解释
    
    网络字节序规定, 收到的第一个字节被当作高位看待, 这就要求发送端发送的第一个字节应当是高位。
    而在发送端发送数据时, 发送的第一个字节是该数据在内存中起始地址对应的字节
    
    可见网络字节顺序采用 big endian(大端)排序方式
*/
/*
    字节序转换注意事项:
    
    只有在多字节数据处理时才需要考虑字节序; 
    
    运行在同一台计算机上的进程相互通信时,一般不用考虑字节序; 
    异构计算机之间通讯, 需要转换自己的字节序为网络字节序
*/

3. 判断大小端模式

#include <iostream>
using namespace std;

union MyUnion
{
	char _str[4];
	unsigned int _uNum;
};

int main()
{
	unsigned int uNum = 0x12345678;
	char *ptr = (char*)&uNum;
	
	for (int i = 0; i < 4;++i)
	{
		std::printf("%x", *ptr);
		++ptr;
	}
	
	/*  或者使用共用体实现  
	    
	    MyUnion mUnion;
	    mUnion._uNum = 0x12345678;
	    for (int i = 0; i < 4; ++i)
	    {
		    std::printf("%x", *(mUnion._str + i));
	    }
	*/
	return 0;
}

/*
    result:   78563412

    从输出结果可以看出本机采用小端存储模式, 高字节 0x12存储在高地址 
*/

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值