分享

C语言编程中的8位、16位、32位整数的分解与合并

 新用户79878317 2021-07-24

  在单片机的编程中对于8位、16位、32位整数的分解与合并用的比较多,今天做了简要学习,后面还需要加以总结。

  练习在VC++6.0编程环境中进行,源程序:

  1. #include <stdio.h>
  2. #include 'string.h'
  3. int main(int argc, char* argv[])
  4. {
  5. unsigned int Data_Uint32=0x12345678;
  6. unsigned short int Data_Uint16_1,Data_Uint16_2;
  7. unsigned char Data_Uint8_1,Data_Uint8_2,Data_Uint8_3,Data_Uint8_4;
  8. struct StructByte8{
  9. unsigned char Byte01:1;
  10. unsigned char Byte02:1;
  11. unsigned char Byte03:1;
  12. unsigned char Byte04:1;
  13. unsigned char Byte05:1;
  14. unsigned char Byte06:1;
  15. unsigned char Byte07:1;
  16. unsigned char Byte08:1;
  17. } Test1;
  18. unsigned char C1[]='A';
  19. //定义16位的指针将32位地址强制转为16位,高位丢弃取低位
  20. unsigned short int *p16=(unsigned short int *)(&Data_Uint32);
  21. unsigned short int Data_Uint16_2p,Data_Uint16_1p;
  22. printf('32位整数:0x%x\n',Data_Uint32);
  23. printf('-------------------通过指针运算-------------------\n');
  24. Data_Uint16_2p=*(unsigned short int *)p16;
  25. Data_Uint16_1p=*((unsigned short int *)p16+1);
  26. printf('转换后的16位整数:0x%x,0x%x\n',Data_Uint16_1p,Data_Uint16_2p);
  27. Data_Uint8_1= *(unsigned char *)p16;
  28. Data_Uint8_2= *((unsigned char *)p16+1);
  29. Data_Uint8_3= *((unsigned char *)p16+2);
  30. Data_Uint8_4= *((unsigned char *)p16+3);
  31. printf('转换后的8位整数:0x%x,0x%x,0x%x,0x%x\n',Data_Uint8_1,Data_Uint8_2,
  32. Data_Uint8_3,Data_Uint8_4);
  33. Data_Uint8_1=0;Data_Uint8_2=0;Data_Uint8_3=0;Data_Uint8_4=0;
  34. //直接根据指针取值
  35. //将32位的整数分解成两个16位的整数,再取低位的16位
  36. //强制转换,丢弃高位的16位
  37. //32位转16位
  38. Data_Uint16_1=(unsigned short int)(Data_Uint32>>16);
  39. Data_Uint16_2=(unsigned short int)Data_Uint32;
  40. //32位转8位
  41. Data_Uint8_1= (unsigned char)(Data_Uint32>>24);
  42. Data_Uint8_2= (unsigned char)(Data_Uint32>>16);
  43. Data_Uint8_3= (unsigned char)(Data_Uint32>>8);
  44. Data_Uint8_4= (unsigned char)Data_Uint32;
  45. printf('-------------------通过位运算-------------------\n');
  46. printf('转换后的16位整数:0x%x,0x%x\n',Data_Uint16_1,Data_Uint16_2);
  47. printf('转换后的8位整数:0x%x,0x%x,0x%x,0x%x\n',Data_Uint8_1,Data_Uint8_2,
  48. Data_Uint8_3,Data_Uint8_4);
  49. printf('-------------------通过结构运算-------------------\n');
  50. printf('字符A,ASCII为01000001,结构转换后的内容\n');
  51. memcpy(&Test1, C1, sizeof(Test1));
  52. printf('Test1.Byte08=%d \n',Test1.Byte08);
  53. printf('Test1.Byte07=%d \n',Test1.Byte07);
  54. printf('Test1.Byte06=%d \n',Test1.Byte06);
  55. printf('Test1.Byte05=%d \n',Test1.Byte05);
  56. printf('Test1.Byte04=%d \n',Test1.Byte04);
  57. printf('Test1.Byte03=%d \n',Test1.Byte03);
  58. printf('Test1.Byte02=%d \n',Test1.Byte02);
  59. printf('Test1.Byte01=%d \n',Test1.Byte01);
  60. Data_Uint8_1=0x89;Data_Uint8_2=0xAB;Data_Uint8_3=0xCD;Data_Uint8_4=0xEF;
  61. printf('-------------------通过位运算合并-------------------\n');
  62. Data_Uint16_1 = (unsigned short int)(Data_Uint8_1 << 8) | (unsigned short int)(Data_Uint8_2);
  63. Data_Uint16_2 = (unsigned short int)(Data_Uint8_3 << 8) | (unsigned short int)(Data_Uint8_4);
  64. Data_Uint32=(unsigned int) (Data_Uint16_1 << 16) | (unsigned int)(Data_Uint16_2);
  65. printf('合并前的8位整数:0x%x,0x%x,0x%x,0x%x\n',Data_Uint8_1,Data_Uint8_2,Data_Uint8_3,Data_Uint8_4);
  66. printf('合并后的16位整数:0x%x,0x%x\n',Data_Uint16_1,Data_Uint16_2);
  67. printf('合并后的32位整数:0x%x\n',Data_Uint32);
  68. return 0;
  69. }

输出:

在这里练习以后进入Keil uVision5编程,想写个通用的转换函数,后面想没有必要,难道8、16位、32位相互转换这么复杂吗?如果这样,写在Keil uVision5里面的程序会是多么复杂,以后自己看起来也会繁琐的。

接着写:

直接强制转换:

  1. printf('-------------------8位到32位转换-------------------\n');
  2. Data_Uint8_1=0x00;
  3. Data_Uint8_2=0x19;
  4. Data_Uint16_2=0x00;
  5. Data_Uint16_1 = (unsigned short int)(0x00 << 8) | (unsigned short int)(Data_Uint8_2);
  6. Data_Uint32=(unsigned int) (0x00 << 16) | (unsigned int)(Data_Uint16_1);
  7. printf('转换前的8位整数:0x%x,%d\n',Data_Uint8_2,sizeof(Data_Uint8_2));
  8. printf('8位到32位转换1======>转换后的32位整数:0x%x,数据长度:%d\n',Data_Uint32,sizeof(Data_Uint32));
  9. Data_Uint32=(unsigned int) (0x00 << 16) | (unsigned int)( (unsigned short int)(0x00 << 8) | (unsigned short int)(Data_Uint8_2));
  10. printf('8位到32位转换2======>转换后的32位整数:0x%x,数据长度:%d\n',Data_Uint32,sizeof(Data_Uint32));
  11. //Data_Uint32=(unsigned int) (0x00 << 24) | (unsigned int)(Data_Uint8_2);
  12. Data_Uint32= (unsigned int)(Data_Uint8_2);
  13. printf('8位到32位转换3======>转换后的32位整数:0x%x,数据长度:%d\n',Data_Uint32,sizeof(Data_Uint32));
  14. Data_Uint32=0x69;
  15. Data_Uint8_1= (unsigned char)(Data_Uint32);
  16. printf('32位整数:0x%x,数据长度:%d\n',Data_Uint32,sizeof(Data_Uint32));
  17. printf('32位到8位转换======>转换后的8位整数:0x%x,数据长度:%d\n',Data_Uint8_1,sizeof(Data_Uint8_1));

实际输出:

-------------------8位到32位转换-------------------
转换前的8位整数:0x19,1
8位到32位转换1======>转换后的32位整数:0x19,数据长度:4
8位到32位转换2======>转换后的32位整数:0x19,数据长度:4
8位到32位转换3======>转换后的32位整数:0x19,数据长度:4
32位整数:0x69,数据长度:4
32位到8位转换======>转换后的8位整数:0x69,数据长度:1

说明:8位强制转32位,前面系统自动加了24位的0;32位强制转8位,系统只截取了最后的8位。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多