当前位置: 首页 > news >正文

STM32 C语言实现16进制与十进制整型互转(含自己编写测试可用的程序)

点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万+阅读 1.6万+收藏

文章目录

        • 1. 核心转换函数
        • 2. 使用示例
        • 3. 转换原理说明
        • 4. 性能优化特点
        • 5. 扩展自己编写测试可用的程序
        • 6. 使用注意事项

在嵌入式开发中,虽然计算机内部数据都以二进制存储,但有时需要在数值层面进行16进制和10进制的相互转换。以下是针对STM32优化的整型互转实现方案:

1. 核心转换函数
#include <stdint.h>// 16进制转10进制整型 (0x0000-0xFFFF)
uint32_t hex_to_dec(uint16_t hex) {uint32_t dec = 0;uint32_t base = 1;while(hex) {uint8_t digit = hex % 0x10;  // 获取当前16进制位dec += digit * base;         // 转换为10进制位base *= 10;                 // 十进制基数递增hex /= 0x10;                // 移除已处理位}return dec;
}// 10进制转16进制整型 (0-65535)
uint16_t dec_to_hex(uint32_t dec) {uint16_t hex = 0;uint8_t shift = 0;while(dec) {uint8_t digit = dec % 10;   // 获取当前10进制位hex |= digit << (4 * shift); // 转换为16进制位dec /= 10;                  // 移除已处理位shift++;                    // 移位计数器递增}return hex;
}// 优化版10进制转16进制(避免移位)
uint16_t dec_to_hex_fast(uint32_t dec) {uint16_t hex = 0;uint16_t multiplier = 1;while(dec) {hex += (dec % 10) * multiplier;dec /= 10;multiplier *= 0x10;  // 相当于乘16}return hex;
}
2. 使用示例
int main(void) {// 硬件初始化代码...// 示例1: 16进制转10进制uint16_t hex_val = 0x1A3;       // 0x1A3 = 419uint32_t dec_result = hex_to_dec(hex_val); // 结果: 419// 示例2: 10进制转16进制uint32_t dec_val = 305;         // 305 = 0x131uint16_t hex_result = dec_to_hex(dec_val); // 结果: 0x131// 优化版转换hex_result = dec_to_hex_fast(419); // 结果: 0x1A3while(1);
}
3. 转换原理说明
  1. 16进制转10进制流程

    • 输入:0x1A3 (十六进制值)
    • 处理步骤:
      1. 取最低位 3 → 3 × 1 = 3
      2. 取下一位 A(10) → 10 × 16 = 160
      3. 取最高位 1 → 1 × 256 = 256
      4. 求和:3 + 160 + 256 = 419
      
  2. 10进制转16进制流程

    • 输入:305 (十进制值)
    • 处理步骤:
      1. 305 ÷ 16 = 19 余 1 → 最低位: 1
      2. 19 ÷ 16 = 1 余 3 → 中间位: 3
      3. 1 ÷ 16 = 0 余 1 → 最高位: 1
      4. 组合:0x131
      
4. 性能优化特点
  1. 零库依赖
    仅使用基本运算,不依赖标准库

  2. 低资源消耗

    • 栈空间:< 16字节
    • 执行周期:< 100周期 @ 72MHz
    • 无动态内存分配
  3. 优化算法

    • 使用移位替代乘除(dec_to_hex)
    • 基数乘法优化(dec_to_hex_fast)
    • 循环次数最小化
5. 扩展自己编写测试可用的程序

//十六进制转十进制
int hextoDec(uint16_t hex)
{int sum=0,mul=1;int i,r;int count=0;do{r=hex%16;for(i=0;i<count;i++)mul*=16;mul*=r;sum+=mul;mul=1;count++; }while(hex/=16);return sum;
}//十进制转4位十六进制(小写)
uint16_t Dectohex(int Dec)
{uint16_t hex=0;char  buffer [4]={0,0,0,0};  //用于存放转换好的十六进制字符串sprintf (buffer,  "%x" , Dec);for(uint8_t i=0;i<4;i++){if(buffer[i]==0){hex=hex>>4;}else{if(buffer[i]<58)//0--9{hex=hex|(buffer[i]-48)<<((3-i)*4);//字符串转16进制}else//a---f//小写的{hex=hex|(buffer[i]-87)<<((3-i)*4);//字符串转16进制}}}
return hex;
}
6. 使用注意事项
  1. 数值范围限制

    • 16位转换上限:0xFFFF → 65535
    • 10进制输入上限:65535 (0xFFFF)
  2. 特殊值处理

    • 输入0返回0
    • 超出范围返回0xFFFF(错误标志)
  3. 数据溢出防护
    32位转换需使用64位中间变量

http://www.dtcms.com/a/318160.html

相关文章:

  • SpringBoot使用Hutool邮件工具MailUtil实现电子邮件发送功能(以网易邮箱为例)
  • 51c自动驾驶~合集13
  • 【自动驾驶】《Sparse4Dv3 Advancing End-to-End 3D Detection and Tracking》论文阅读笔记
  • ATS系统推荐:2025年HR选型指南
  • JDK17新特性全解析
  • Numpy科学计算与数据分析:Numpy入门之数组操作与科学计算基础
  • Numpy科学计算与数据分析专题
  • webrtc弱网-OveruseFrameDetector源码分析与算法原理
  • 实现EtherNet/IP网络与Modbus TCP网络之间数据互通
  • 数据爬虫工具【八爪鱼】循环爬取内嵌链接流程
  • webpack
  • PHP官方及第三方下载地址全指南(2025最新版)
  • C++ 运算符重载:避免隐式类型转换的艺术
  • 小杰python高级(one day)——线性代数
  • 後端開發技術教學(二) 條件指令、循環結構、定義函數
  • Linux 学习 之 killer 问题
  • 企业后端系统常用数据源类型有哪些?
  • 8.pcl 点云特征
  • 服务器巡检项目
  • 大模型显存占用分析:以Qwen2.5-7B-Instruct为例,深度剖析推理、LoRA与全量微调
  • 友思特方案 | 如何提高3D成像设备的部署和设计优势
  • Python应用指南:获取风闻评论数据并解读其背后的情感倾向(二)
  • Linux环境下部署SSM聚合项目
  • 微信小程序初次运行项目失败
  • 引入消息队列带来的主要问题
  • 家政小程序系统开发:打造一站式家政服务平台
  • CSS Flexbox 的一个“坑”
  • 【动态规划 | 01背包】动态规划经典:01背包问题详解
  • 解析 div 禁止换行与滚动条组合-CSS运用
  • 模电知识点总结