快盘下载:好资源、好软件、快快下载吧!

快盘排行|快盘最新

当前位置:首页软件教程电脑软件教程 → C语言:8位、16位、32位数据转换

C语言:8位、16位、32位数据转换

时间:2022-09-28 15:05:37人气:作者:快盘下载我要评论

先看一下测试代码

#include <stdio.h>

int main()
{
   /*  Write C code in this online editor and run it. */
	int WifiIPSet=0;
	int WifiIPSet1=0;
	int  WifiIPSet2=0;
	int  WifiIPSet3=0;
   int Ip_data=0x12345678;	
	int Ip_data1=0;
	int Ip_data2=0;
	int Ip_data3=0;
	int Ip_data4=0;
	Ip_data1=((Ip_data   >>   24)   &   0xff);
	Ip_data2=((Ip_data   >>   16)   &   0xff);
	Ip_data3=((Ip_data   >>   8)   &   0xff);
	Ip_data4=((Ip_data   )   &   0xff);                         
     printf(;Ip_data1=%hX
;,Ip_data1);
	 printf(;Ip_data2=%hX
;,Ip_data2);
	 printf(;Ip_data3=%hX
;,Ip_data3);
	 printf(;Ip_data4=%hX
;,Ip_data4);
	 WifiIPSet=((Ip_data1<<8) |((Ip_data2)));
	 WifiIPSet1=((Ip_data2<<8)|((Ip_data3)));
	 printf(;WifiIPSet=%hX
;,WifiIPSet);
	 printf(;WifiIPSet1=%hX
;,WifiIPSet1); 
	WifiIPSet2 = (Ip_data1<<24)|(Ip_data2<<16)|(Ip_data3<<8)|(Ip_data4);
WifiIPSet3 = ((WifiIPSet << 16) )| (WifiIPSet1);
printf(;WifiIPSet2=%2X
;,WifiIPSet2);
	printf(;WifiIPSet3=%X
;,WifiIPSet3);
   return 0;
}

输出结果

Ip_data1=12
Ip_data2=34
Ip_data3=56
Ip_data4=78
WifiIPSet=1234
WifiIPSet1=3456
WifiIPSet2=12345678
WifiIPSet3=12343456


一、移位法

8位转16位

将2个8位数据high、low合成一个16位数据data_u16;

data_u16 = (high<<8) | low;

16位转8位

将一个16位数据data_u16拆分成2个8位数据high、low;

data_u16 = (high<<8) | low;

	high = (data_u16 >> 8) & 0xff;	 	//高8位
	low = 	data_u16 	   & 0xff; 		//低8位

8位转32位

将4个8位数据data_u8[4]合成一个32位数据data_u32;

8位转32位
将4个8位数据data_u8[4]合成一个32位数据data_u32;

32位转8位

将一个32位数据data_u32拆分成4个8位数据data_u8[4];

data_u8[0] = (data_u32 >> 24) & 0xff;	 
data_u8[1] = (data_u32 >> 16) & 0xff; 	   
data_u8[2] = (data_u32 >> 8)  & 0xff;
data_u8[3] =  data_u32        & 0xff;
//高位在前;低位在后

16位转32位

将2个16位数据data_u16[2]合成一个32位数据data_u32;

data_u32 = (data_u16[0]<<16)|data_u16[1];

32位转16位

将一个32位数据data_u32拆分成2个16位数据data_u16[2];

data_u16[0] = (data_u32 >> 16) & 0xffff;	 //高16位
data_u16[1] =  data_u32        & 0xffff; 	 //低16位

二、共用体法

运用共用体共享内存的特性;实现转换。
不了解共用体的朋友;可以点击下方蓝色链接;文章里有详细的讲解。

C语言;关键字—union;声明共用体类型;

16位 与 8位 互转

#include <stdio.h>

typedef unsigned          char 		uint8_t;
typedef unsigned short     int 		uint16_t;
typedef unsigned           int 		uint32_t;

//声明共用体
typedef union 
{
	uint8_t data8[2];
	uint16_t data16;
} _MQ;
//定义共用体变量
_MQ mq ;

int main(void)
{	
/***************************16位转8位*******************************/
	mq.data16 = 0x1234;//给16位数据赋值
	
	printf(;data16=0x%x

;,mq.data16);//输出16位数据数值
	
	printf(;data8[0]=0x%x
;,mq.data8[0]);//输出低8位数据数值
	printf(;data8[1]=0x%x

;,mq.data8[1]);//输出高8位数据数值
	
/***************************8位转16位*******************************/	
	mq.data8[0] = 0x78;//给8位数据0赋值
	mq.data8[1] = 0x56;//给8位数据1赋值
	
	printf(;data8[0]=0x%x
;,mq.data8[0]);//输出低8位数据数值
	printf(;data8[1]=0x%x

;,mq.data8[1]);//输出高8位数据数值
	
	printf(;data16=0x%x

;,mq.data16);//输出16位数据数值
	
	return 0;
}

C语言:8位、16位、32位数据转换

 

32位 与 16位 互转

具体代码如下;

#include <stdio.h>

typedef unsigned          char 		uint8_t;
typedef unsigned short     int 		uint16_t;
typedef unsigned           int 		uint32_t;

//声明共用体
typedef union 
{
	uint16_t data16[2];
	uint32_t data32;
} _MQ;
//定义共用体变量
_MQ mq ;

int main(void)
{	
/***************************32位转16位*******************************/
	mq.data32 = 0x12345678;//给32位数据赋值
	
	printf(;data32=0x%x

;,mq.data32);//输出32位数据数值
	
	printf(;data16[0]=0x%x
;,mq.data16[0]);//输出低16位数据数值
	printf(;data16[1]=0x%x

;,mq.data16[1]);//输出高16位数据数值
	
/***************************16位转32位*******************************/	
	mq.data16[0] = 0x3344;//给16位数据0赋值
	mq.data16[1] = 0x1122;//给16位数据1赋值
	
	printf(;data16[0]=0x%x
;,mq.data16[0]);//输出低8位数据数值
	printf(;data16[1]=0x%x

;,mq.data16[1]);//输出高8位数据数值
	
	printf(;data32=0x%x

;,mq.data32);//输出16位数据数值
	
	return 0;
}

 

32位 与 8位 互转

具体代码如下;

#include <stdio.h>

typedef unsigned          char 		uint8_t;
typedef unsigned short     int 		uint16_t;
typedef unsigned           int 		uint32_t;

//声明共用体
typedef union 
{
	uint8_t data8[4];
	uint32_t  data32;
} _MQ;
//定义共用体变量
_MQ mq ;

int main(void)
{	
/***************************32位转8位*******************************/
	mq.data32 = 0x12345678;//给32位数据赋值
	
	printf(;data32=0x%x

;,mq.data32);//输出32位数据数值
	
	//输出8位数据;低字节在前;高字节在后。
	printf(;data8[0]=0x%x
;,mq.data8[0]);
	printf(;data8[1]=0x%x
;,mq.data8[1]);
	printf(;data8[2]=0x%x
;,mq.data8[2]);
	printf(;data8[3]=0x%x

;,mq.data8[3]);
	
/***************************8位转32位*******************************/	
	mq.data8[0] = 0x11;//给8位数据0赋值
	mq.data8[1] = 0x22;//给8位数据1赋值 
	mq.data8[2] = 0x33;//给8位数据2赋值
	mq.data8[3] = 0x44;//给8位数据3赋值
	
	printf(;data8[0]=0x%x
;,mq.data8[0]);
	printf(;data8[1]=0x%x
;,mq.data8[1]);
	printf(;data8[2]=0x%x
;,mq.data8[2]);
	printf(;data8[3]=0x%x

;,mq.data8[3]);
	
	printf(;data32=0x%x

;,mq.data32);//输出32位数据数值
	
	return 0;
}

C语言:8位、16位、32位数据转换

 

C语言输出数据的格式C语言中的二进制数、八进制数和十六进制数

#include <stdio.h>
int main()
{
    short a = 0b1010110;  //二进制数字
    int b = 02713;  //八进制数字
    long c = 0X1DAB83;  //十六进制数字
   
    printf(;a=%ho, b=%o, c=%lo
;, a, b, c);  //以八进制形似输出
    printf(;a=%hd, b=%d, c=%ld
;, a, b, c);  //以十进制形式输出
    printf(;a=%hx, b=%x, c=%lx
;, a, b, c);  //以十六进制形式输出;字母小写;
    printf(;a=%hX, b=%X, c=%lX
;, a, b, c);  //以十六进制形式输出;字母大写;
    return 0;
}
 运行结果;
a=126, b=2713, c=7325603
a=86, b=1483, c=1944451
a=56, b=5cb, c=1dab83
a=56, b=5CB, c=1DAB83

C语言中的二进制数、八进制数和十六进制数

1.C语言中的二进制数、八进制数和十六进制数

>>8) & 0xFF中的 >> 和 &0xFF 的作用
参考;https://blog.csdn.net/iamgamer/article/details/79354617

其中有两个位运算;一个是>>;一个是&。

0xff的作用一:

十六进制0xff的长度是一个字节;即八位;二进制为;1111 1111;那么一个 8bit 数与1111 1111与运算还是这个数本身;但是一个16bit 数与 0xff就被截断了;比如 1100110011001100 & 0xff结果为 11001100。那如果想不被截断怎么办?把0xff扩展为二个字节即;0xffff;那么以此类推;0xffffff,0xffffffff都出来了。

0xff的作用二:

java专属;由于java没有unsigned类型;所以为了适应与其他语言二进制通讯时各种数据的一致性;需要做一些处理。

最直观的例子;int a = -127 & 0xFF ; // 等同于 unsigned int c = 129; (这里的-127与129是字节;只为了直观而写的具体数字)

这里要严格说明一点;再32位机器上;0xff实际上是 0x00000000 00000000 00000000 11111111;

而-127是 11111111 11111111 11111111 10000001 (补码形式), 那么-127 & 0xff的结果自然是

00000000 00000000 00000000 10000001 即 129.

简而言之;该作用主要是为了将 有符号数转换为无符号数。

>>8的作用;

这个是根据需求而定的;可以是>>8也可以是>>16,>>24,等等

而跟 & 0xff运算的意义其实就是截断;将123456的高位右移8位;通过0xff截取出来。实际意义就是取字节;比如一个4字节的数;需要将每个字节内容取出来转换出目标数据;那么通过>> 并且 &0xff 运算 就可以去除想要的部分。

再详细点;4字节 ;32 位;按照大端方式排列;

最高位                                         最低位

11111111 10101010 11000011 10101010

最高位8字节要移到最低位那么;这个8个字节>>;3*8;;然后与0xff运算;取出;然后后续得>>(2*8) & 0xff ;>>(1*8) & 0xff,均可取出。

网友评论

快盘下载暂未开通留言功能。

关于我们| 广告联络| 联系我们| 网站帮助| 免责声明| 软件发布

Copyright 2019-2029 【快快下载吧】 版权所有 快快下载吧 | 豫ICP备10006759号公安备案:41010502004165

声明: 快快下载吧上的所有软件和资料来源于互联网,仅供学习和研究使用,请测试后自行销毁,如有侵犯你版权的,请来信指出,本站将立即改正。