我看了很多十进制转换十六进制的文章,几乎全部都是利用scanf()函数写的,这和我想实现的功能并不一样,因为scanf是通过键盘进行输入,我只是想将一个数组里的十进制数通过调用一个函数转换为十六进制数然后储存到另一个数组里,于是我打算自己写一个转换函数。

关于十进制转十六进制

十进制转十六进制的方法网上介绍的很多,这里简单说明一下。用十进制的数除以十六,得到的余数保留,得到的商继续除以十六,直至除到商为0为止,将先得到的余数排在最右边,后得到的按照顺序依次往左排,排完所有的余数之后,便得到了十进制对应的十六进制数。更详细的教程可以去百度。
我用的编译器是keil5,支持标准C的编译器应该均适用。
函数整体结构:

代码的结构很简单,就是for循环里面嵌套几个if、else if做判断,if里面用switch语句判断余数,根据余数大小来判断接下来要做的操作。
for循环的次数由你想转换多少个十进制数来定,可以创建一个数组,通过函数形参传入函数内部,case语句里面就是实现一个循环右移的操作。函数很简单,大家不要因为太长被吓到,菜鸟都能看的懂。如果编译环境一样,应该可以直接用。

代码实现

#define length_16 4
unsigned short int HexData_16[length_16];        //用于缓存16位十六进制数的区域
/* --------------十进制(16位)转换为十六进制---------------- */
void Dec2Hex_16(unsigned short int* temp)
{int i,j,m,n,x;unsigned short int Hex = 0xFFFF;unsigned short int 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的数,要对数除四次商才为0{rem = Dec % 16;mer = Dec / 16;Dec = mer;switch(rem)           //看余数为多少{case 0:{Hex &= 0xFFF0;    //如果为0,则让16进制数最后四位赋0Hex >>= 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;}}}}else if(Dec >= 256 && Dec < 4096){for(m = 0;m < 3;m++)   //这里只循环3次,因为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,%04x\r\n",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;
}

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

C语言实现十进制转换成十六进制的实现(有例程),不用scanf函数,STM32 在Keil5环境相关推荐

  1. C语言:十进制转换成十六进制字符串和数组

    1.十进制转换成十六进制字符串 #include<stdio.h> /*函数: 将十进制数字转换为十六进制,并将转换后的数字存储在字符串中并输出 */ void dec2hex(int n ...

  2. C语言将十进制转换成十六进制

    #include<stdio.h> main() {char arr[50]="";char *p= arr;int i ;scanf("%d", ...

  3. c语言的十进制转十六进制字符串,用c语言写一个函数把十进制转换成十六进制,该如何处理...

    用c语言写一个函数把十进制转换成十六进制 用c语言写一个函数把十进制转换成十六进制 网上找到一些,感觉有占乱 分享到: ------解决方案-------------------- #include ...

  4. c语言中如何将字符串转成16进制,用c语言写一个函数把十进制转换成十六进制,该如何处理...

    用c语言写一个函数把十进制转换成十六进制 用c语言写一个函数把十进制转换成十六进制 网上找到一些,感觉有占乱 分享到: ------解决方案-------------------- #include ...

  5. 通过代码实现将十进制转换成十六进制

    通过代码求50的十六进制 上一篇博客已经介绍了十进制转换成十六进制的方法,因此我们可以得到50的二进制为00110010,十六进制为32.下面我将介绍两种方法求出50的十六进制. 方法一:自动实现 思 ...

  6. 蓝桥杯C/C++每日一练之十进制转换成十六进制

    第十三届蓝桥杯大赛个人赛省赛比赛将于2022年4月9日(星期六)举办,趁现在寒假的时间抓紧时间备战一下.因为博主本人报名是C/C++组,所以更新所有内容都是C/C++相关知识.题目全部都是蓝桥杯官网题 ...

  7. 十进制转换成十六进制小程序(强制转换和移位运算符)

    涉及知识点:强制类型转换,移位运算符,十进制转换十六进制. 十进制数 60 转换成十六进制过程分析 60的二进制表示: 0000-0000  0000-0000  0000-0000  0011-11 ...

  8. 十进制转换成十六进制(超简c++)

    十进制转换成二进制需要注意整型与字符型变量之间的变换 如1+'0'  %d输出为49 (即'0' 的ASCII码加一) %c输出为1    (相当与输出字符'1') 上代码: #include< ...

  9. iOS 十进制转换成十六进制

    将NSString转换成十六进制的字符串则可使用如下方式: - (NSString *)ToHex:(uint16_t)tmpid { NSString *nLetterValue; NSString ...

最新文章

  1. 安装win10操作系统的设备将要突破10亿台
  2. 简单验证码识别 tessnet2
  3. python-装饰器,类与对象,私有字段,析构,__call__,继承,多继承,接口
  4. C语言宏定义中使用 do{}while(0) 的情形
  5. linux 快速启动程序,在Linux上安装ULauncher快速启动应用程序的方法
  6. ecshop各个文件夹作用
  7. QT_Qsplitter
  8. C语言线程创建与锁机制
  9. java性能瓶颈分析_Java性能优化技巧整理,做一个深度的程序员
  10. rocketmq 几种队列_进阶必看的 RocketMQ ,就这篇了
  11. 程序员斗图时最爱用哪些表情包?拿走不谢!
  12. A network analyzer is used for
  13. php 写入txt换行_php是如何向文件中写入换行
  14. 山东大学计算机组成课设,山东大学计算机组成原理课程设计实验报告.pdf
  15. dp hp oracle 备份软件_HP DP备份软件设置
  16. IntelliJ IDEA 记学习笔《Patch 创建补丁》
  17. 等你等了这么久:DTCC2021中国数据库技术大会 Galaxybase万亿大图实践分享——终于来了!
  18. PostgreSQL 基于heap表引擎的事务 实现原理
  19. 【实战毕业论文排版】图片添加题注实现自动编号
  20. 发送邮件被对方服务器退回_如何更好地给老外发邮件,可以了解下

热门文章

  1. ReSharper C++ 2021.2,以帮助您实现代码的现代化
  2. 感悟:搞了整整一天,拯救一个Ubuntu系统
  3. 基于Java理发店会员管理系统设计实现(源码+lw+部署文档+讲解等)
  4. 安卓苹果手机调起QQ分享
  5. 位运算的一些有用的操作
  6. 联想y430p win8.1 解决qq语音 qq视频卡死 yy卡死 等录音软件卡死问题
  7. 基于Swing的Java扫雷游戏
  8. Linux IOCTL
  9. 张鑫溢:8.30今日黄金原油是涨还是跌,鲍威尔暗示打压金价走势?
  10. 数据冒险之顺序表应用