首页 > 编程知识 正文

十进制转十六进制c语言代码,十六进制转十进制C语言

时间:2023-05-06 09:15:05 阅读:59304 作者:3924

我读了很多十进制转换的十六进制文章,几乎全部是用scanf )函数写的。 这和我想实现的功能不同。 因为scanf是从键盘输入的,所以我只是想通过调用一个函数将一个数组的十进制数转换为十六进制数并存储在另一个数组中。 我打算在那里自己写变换函数。

关于从十进制到十六进制的十进制到十六进制的转换方法,网上有很多介绍,在这里简单说明一下。 十进制数除以十六剩下馀数,所得的商继续除以十六,直到商为0,先将所得的馀数排在最右边,再将后所得的按顺序排在左边,排完所有的馀数后,得到与十进制数相对应的十六进制数。 更详细的教程可以去百度。

我使用的编译器是keil5

函数的整体结构:

的结构很简单,通过for循环中嵌套了多少if、else if来判断,在if中通过switch语句判断馀数,通过馀数的大小来判断下一步要进行的操作。

for循环的次数取决于想要转换多少个十进制数。 可以创建数组,并通过函数类型参数传递到函数内部。 case语句中是实现循环右移的操作。 函数很简单。 大家都太长了,请不要吓我。 私下里也知道。 如果编译环境相同,应该可以直接使用。

代码实现# define length _ 164 unsignedshortinthexdata _ 16 [ length _ 16 ];//用于缓存16位十六进制数的区域--------------------------------(将转换为十六进制数(Unsiii ) ) )。 未指定短整型hex=0x ffff; 未指定短整型dec=0; unsigned short int rem=0; //定义剩余变量unsigned short int mer=0定义商变量for (I=0; i length_16; I )//有几个要转换的数,length_16是数({Dec=temp[i]; if(dec=4096 ) for ) j=0; j 4; 大于j//4096的数是4次商除以对数等于0的0{rem=Dec % 16; mer=Dec/16; Dec=mer; 查看交换机(rem )//剩余数量(case0: ) HEX=0xfff0; //0时,将0Hex=4代入十六进制数最后4位//然后向右移动4位,在下一个循环中运算下4位的Hex |=0x0000; //这里是实现循环右移的效果,其实是把删除的数重新代入最左边的break; }case 1:{Hex=0xFFF1; Hex=4; Hex |=0x1000; 布雷克; }case 2:{Hex=0xFFF2; Hex=4; Hex |=0x2000; 布雷克; }case 3:{Hex=0xFFF3; Hex=4; Hex |=0x3000; 布雷克; }case 4:{Hex=0xFFF4; Hex=4; Hex |=0x4000; 布雷克; }case 5:{Hex=0xFFF5; Hex=4; Hex |=0x5000; 布雷克; }case 6:{Hex=0xFFF6; Hex=4; Hex |=0x6000; 布雷克; }case 7:{Hex=0xFFF7; Hex=4; Hex |=0x7000; 布雷克; }case 8:{Hex=0xFFF8; Hex=4; Hex |=0x8000; 布雷克; }case 9:{Hex=0xFFF9; Hex=4; Hex |=0x9000; 布雷克; }case 10:{Hex=0xFFFA; Hex=4; Hex |=0xA000; 布雷克; }case 11:{Hex=0xFFFB; Hex=4; Hex |=0xB000; 布雷克; }case 12:{Hex=0xFFFC; Hex=4; Hex |=0xC000; 布雷克; }case 13:{Hex=0xFFFD; Hex=4; Hex |=0xD000; 布雷克; }case 14:{Hex=0xFFFE; Hex=4; Hex |=0xE000; 布雷克; }case 15:{Hex=0xFFFF; Hex=4; Hex |=0xF000; 布雷克; }}}elseif(dec=256dec4096 ) ) for ) m=0; m 3; m(//因为这里只循环256~4095次

的数除3次余数便为0,循环四次的话结果不对{rem = Dec % 16;mer = Dec / 16;Dec = mer;switch(rem){case 0:{Hex &= 0xFFF0;Hex >>= 4;Hex |= 0x0000;break;}case 1:{Hex &= 0xFFF1;Hex >>= 4;Hex |= 0x1000;break;}case 2:{Hex &= 0xFFF2;Hex >>= 4;Hex |= 0x2000;break;}case 3:{Hex &= 0xFFF3;Hex >>= 4;Hex |= 0x3000;break;}case 4:{Hex &= 0xFFF4;Hex >>= 4;Hex |= 0x4000;break;}case 5:{Hex &= 0xFFF5;Hex >>= 4;Hex |= 0x5000;break;}case 6:{Hex &= 0xFFF6;Hex >>= 4;Hex |= 0x6000;break;}case 7:{Hex &= 0xFFF7;Hex >>= 4;Hex |= 0x7000;break;}case 8:{Hex &= 0xFFF8;Hex >>= 4;Hex |= 0x8000;break;}case 9:{Hex &= 0xFFF9;Hex >>= 4;Hex |= 0x9000;break;}case 10:{Hex &= 0xFFFA;Hex >>= 4;Hex |= 0xA000;break;}case 11:{Hex &= 0xFFFB;Hex >>= 4;Hex |= 0xB000;break;}case 12:{Hex &= 0xFFFC;Hex >>= 4;Hex |= 0xC000;break;}case 13:{Hex &= 0xFFFD;Hex >>= 4;Hex |= 0xD000;break;}case 14:{Hex &= 0xFFFE;Hex >>= 4;Hex |= 0xE000;break;}case 15:{Hex &= 0xFFFF;Hex >>= 4;Hex |= 0xF000;break;}}}/* 上面的for循环循环了3次,这样会导致前三个数是正常的,最后一个数是F, 得到的结果也是错的,所以要再右移一次,给最左边赋0 */Hex &= 0xFFF0;Hex >>= 4;Hex |= 0x0000;}else if(Dec >= 16 && Dec < 256){for(n = 0;n < 2;n++){rem = Dec % 16;mer = Dec / 16;Dec = mer;switch(rem){case 0:{Hex &= 0xFFF0;Hex >>= 4;Hex |= 0x0000;break;}case 1:{Hex &= 0xFFF1;Hex >>= 4;Hex |= 0x1000;break;}case 2:{Hex &= 0xFFF2;Hex >>= 4;Hex |= 0x2000;break;}case 3:{Hex &= 0xFFF3;Hex >>= 4;Hex |= 0x3000;break;}case 4:{Hex &= 0xFFF4;Hex >>= 4;Hex |= 0x4000;break;}case 5:{Hex &= 0xFFF5;Hex >>= 4;Hex |= 0x5000;break;}case 6:{Hex &= 0xFFF6;Hex >>= 4;Hex |= 0x6000;break;}case 7:{Hex &= 0xFFF7;Hex >>= 4;Hex |= 0x7000;break;}case 8:{Hex &= 0xFFF8;Hex >>= 4;Hex |= 0x8000;break;}case 9:{Hex &= 0xFFF9;Hex >>= 4;Hex |= 0x9000;break;}case 10:{Hex &= 0xFFFA;Hex >>= 4;Hex |= 0xA000;break;}case 11:{Hex &= 0xFFFB;Hex >>= 4;Hex |= 0xB000;break;}case 12:{Hex &= 0xFFFC;Hex >>= 4;Hex |= 0xC000;break;}case 13:{Hex &= 0xFFFD;Hex >>= 4;Hex |= 0xD000;break;}case 14:{Hex &= 0xFFFE;Hex >>= 4;Hex |= 0xE000;break;}case 15:{Hex &= 0xFFFF;Hex >>= 4;Hex |= 0xF000;break;}}}Hex &= 0xFFF0;Hex >>= 4;Hex |= 0x0000;Hex &= 0xFFF0;Hex >>= 4;Hex |= 0x0000;}else if(Dec > 0 && Dec < 16){for(x = 0;x < 1;x++){rem = Dec % 16;mer = Dec / 16;Dec = mer;switch(rem){case 0:{Hex &= 0xFFF0;Hex >>= 4;Hex |= 0x0000;break;}case 1:{Hex &= 0xFFF1;Hex >>= 4;Hex |= 0x1000;break;}case 2:{Hex &= 0xFFF2;Hex >>= 4;Hex |= 0x2000;break;}case 3:{Hex &= 0xFFF3;Hex >>= 4;Hex |= 0x3000;break;}case 4:{Hex &= 0xFFF4;Hex >>= 4;Hex |= 0x4000;break;}case 5:{Hex &= 0xFFF5;Hex >>= 4;Hex |= 0x5000;break;}case 6:{Hex &= 0xFFF6;Hex >>= 4;Hex |= 0x6000;break;}case 7:{Hex &= 0xFFF7;Hex >>= 4;Hex |= 0x7000;break;}case 8:{Hex &= 0xFFF8;Hex >>= 4;Hex |= 0x8000;break;}case 9:{Hex &= 0xFFF9;Hex >>= 4;Hex |= 0x9000;break;}case 10:{Hex &= 0xFFFA;Hex >>= 4;Hex |= 0xA000;break;}case 11:{Hex &= 0xFFFB;Hex >>= 4;Hex |= 0xB000;break;}case 12:{Hex &= 0xFFFC;Hex >>= 4;Hex |= 0xC000;break;}case 13:{Hex &= 0xFFFD;Hex >>= 4;Hex |= 0xD000;break;}case 14:{Hex &= 0xFFFE;Hex >>= 4;Hex |= 0xE000;break;}case 15:{Hex &= 0xFFFF;Hex >>= 4;Hex |= 0xF000;break;}}}Hex &= 0xFFF0;Hex >>= 4;Hex |= 0x0000;Hex &= 0xFFF0;Hex >>= 4;Hex |= 0x0000;Hex &= 0xFFF0;Hex >>= 4;Hex |= 0x0000;}else{Hex = 0x0000;}HexData_16[i] = Hex;}printf("%04x,%04x,%04x,%04xrn",HexData_16[0],HexData_16[1],HexData_16[2],HexData_16[3]);}

在keil里如果要用printf()函数,还需要重定义,从定义函数如下:

#include "stdio.h" //这里要声明stdio.h头文件,不然printf函数会显示未定义,全文中声明一次即可,建议在最顶部声明/* --------------------fputc重定义函数----------------------- */int fputc(int ch,FILE *f){HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,HAL_MAX_DELAY);return ch;}

如果有更好的方法,欢迎交流。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。