uint16_t、uint32_t类型数据高低字节互换

1. 使用位运算和逻辑运算符实现

#include<stdio.h>
#include<stdint.h>
int main()
{
	void test_3()
{
	uint16_t version = 0x1234;
	printf("%#x\n",(uint8_t)version);
	printf("%#x\n", version>>8);
	/**
	 * 在C语言中,uint16和uint8是无符号整数类型,分别表示16位和8位的无符号整数。
	 * 当将uint16类型的变量强制转换为uint8类型时,会导致高8位的数据丢失,只保留低8位的数据。
	 * 这可能会导致数据截断或溢出的问题。
	 * 对于地址的表示,C语言中使用小端字节序(Little Endian)来存储多字节数据类型。
	 * 在小端字节序中,较低的字节存储在较低的地址,而较高的字节存储在较高的地址。
	 * 以0x1234为例,它是一个16位的整数。在小端字节序中,0x34是低字节(低地址),0x12是高字节(高地址)。
	 * 当将其强制转换为uint8类型时,只保留低8位的数据0x34,而高8位的数据0x12会被丢失。.
	 * 
	 */
	 //相当于从低地址到高地址按4321这样存储,
}
}

void test_2()//eg.把2,5分别放入一个uint16_t的高字节和低字节中
{
	uint16_t result = 0;//先给uint16初始化
	uint8_t high_byte = 2;
	uint8_t low_byte = 5;
	result = (high_byte <<8) | low_byte;
	printf("16进制Result:%#x\n",result);
	printf("10进制result:%d\n",result);
	
	/**
	 * 先将high_byte左移8位,
	 * 然后用|将high_byte和low_byte进行合并
	 */
	/**
	 * 0000 0010左移8位变为
	 * 0000 0010 0000 0000 
	 * 与二进制5| 0000 0101
	 * ----------------------
	 * 0000 0010 0000 0101
	 * 得到0x205
	 */
	printf("%#x\n",(uint8_t)result);
	printf("%#x\n", (uint8_t)(result>>8));
}


2. 高低位互换:

2.1 uint16_t高低位互换:

#define FLIPW(h) ((((uint16_t)h << 8)&0xFF00) | ((uint16_t)h >> 8))

2.2 uint32_t高低位互换:

 #define HLIPW(h) ( (((uint32_t)h << 24)&0xFF000000) | (((uint32_t)h << 8)&0x00FF0000) | (((uint32_t)h >> 8)&0x0000FF00) | (((uint32_t)h >> 24)&0x000000FF) )

2.3 两个uint8_t类型合并uint16_t类型:

#define MERAGE2(h,l) ((((uint16_t)h) << 8) | l)

2.4 四个uint8_t类型合并uint32_t类型:

#define MERAGE4(one,two,three,four)	(((uint32_t)one << 24) | ((uint32_t)two << 16) | ((uint16_t)three << 8) | four)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值