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

【14】单片机编程核心技巧:整除运算与数位提取

【14】单片机编程核心技巧:整除运算与数位提取

七律 · 整除玄机

整除根基运算行,数位提取显真明。
先商后余避溢险,先余后商需谨精。
除零溢出当留意,类型扩展保程成。
实验验证真理现,编程妙用万象生。

🌟 目录
  1. 整除求商
  2. 整除求余
  3. 数位提取:先余后商 vs 先商后余
  4. 实验验证与代码示例
  5. 实践建议与注意事项

📌 1. 整除求商(/

🔹 基本规则
  • 运算符号/ 返回商的整数部分,舍弃小数。
  • 适用类型unsigned char, unsigned int, unsigned long(不支持浮点数)。
🔹 特殊情况分析
场景结果示例
除数为0- 变量0:商为255unsigned char)或最大值(其他类型)。
- 常量0:商为1(编译警告)。
a = 23/y;y=0a=255
被除数 < 除数商为0c = 7/10;c=0
被除数 = 除数商为1d = 10/10;d=1
被除数 > 除数商为整数部分。e = 10/4;e=2
🔹 自除简写
g /= 5; // 等价于 g = g / 5;  
🔹 溢出风险
  • 溢出规律:与加法一致,当结果超过变量类型最大值时溢出。
  • 建议:使用 unsigned long 避免溢出。

📌 2. 整除求余(%

🔹 基本规则
  • 运算符号% 返回除法的余数。
  • 适用类型:同求商,不支持浮点数。
🔹 特殊情况分析
场景结果示例
除数为0- 变量0:余数为被除数。
- 常量0:余数为1(但变量除以常量0编译失败)。
a = 23%y;y=0a=23
被除数 < 除数余数等于被除数。c = 7%10;c=7
被除数 = 除数余数为0d = 10%10;d=0
被除数 > 除数余数 < 除数。e = 10%4;e=2
除数为1余数始终为0g = 7%1;g=0
🔹 自除简写
h %= 5; // 等价于 h = h % 5;  
🔹 溢出风险
  • 溢出规律:与求商一致。
  • 建议:使用 unsigned long 避免溢出。

📌 3. 数位提取:先余后商 vs 先商后余

🔹 方法对比
方法步骤示例(以8562为例)
先余后商1. 求余获取低位部分。
2. 求商提取目标位。
千位 = 8562%10000/1000 → 8
先商后余1. 求商获取高位部分。
2. 求余提取目标位。
千位 = 8562/1000%10 → 8
🔹 关键差异
方法优点缺点
先余后商逻辑直观,适合小数值大数值可能溢出,模数需谨慎选择
先商后余避免溢出,对称性好,扩展性强需理解商与余的结合逻辑
🔹 推荐选择
  • 优先选择“先商后余”
    • 避免溢出:例如提取十亿位时,3100000000/1000000000%10 → 3(安全)。
    • 逻辑对称:易于扩展到更高位(如万位、十万位)。

📝 4. 实验验证与代码示例

🔹 求商与求余实验代码
#include <reg52.h>  
void View(unsigned char value); // 假设的串口输出函数  void main() {  // 求商实验  unsigned char a = 23 / 0; // 常量0 → a=1(编译警告)  unsigned char b = 10 / 3; // b=3  // 求余实验  unsigned char c = 23 % 0; // c=1  unsigned char d = 10 % 3; // d=1  View(a); View(b); View(c); View(d);  while(1);  
}  
🔹 数位提取实验代码
void main() {  unsigned char a, b, c, d, e, f, g, h;  unsigned int x = 8562; // 被提取的数  // 先余后商  a = x % 10000 / 1000; // 千位  b = x % 1000 / 100;   // 百位  // 先商后余  e = x / 1000 % 10;    // 千位  f = x / 100 % 10;     // 百位  View(a); View(b); View(e); View(f);  while(1);  
}  
🔹 实验结果
变量先余后商结果先商后余结果
a88
b55
e-8
f-5

⚠️ 实践建议与注意事项

  1. 除数为0的处理

    • 避免除数为0,但若无法避免,需了解其行为(如变量0的商为255)。
    • 变量除以常量0会导致编译失败(如 b = k % 0)。
  2. 溢出风险

    • 使用 unsigned long 类型可扩展数值范围,降低溢出概率。
  3. 代码安全

    • 在除法前检查除数是否为0(如 if (divisor != 0))。
  4. 数位提取优化

    • 使用宏定义封装逻辑,提高复用性:
      #define EXTRACT_DIGIT(n, pos) ((n / pos) % 10)  
      
  5. 调试技巧

    • 通过串口输出或LED闪烁验证运算结果。

🌟 总结

整除运算与数位提取是单片机编程的核心技能:

  • 求商与求余 是基础,需注意除数为0和溢出风险。
  • 数位提取 中,“先商后余”更可靠,尤其在处理大数值时。

终极原则
“谨慎处理除数,合理选择类型,实验验证行为!”


http://www.mrgr.cn/news/93902.html

相关文章:

  • VSCode 2025最新前端开发必备插件推荐汇总(提效指南)
  • Mac如何查看 IDEA 的日志文件
  • vulnhub靶场【digitalworld.local系列】的electrical靶机
  • OpenManus-通过源码方式本地运行OpenManus,含踩坑及处理方案,chrome.exe位置修改
  • 用python和Pygame库实现“跳过障碍”游戏
  • 从0开始的操作系统手搓教程33:挂载我们的文件系统
  • 若依RuoYi-Cloud-Plus微服务版(完整版)前后端部署
  • c语言笔记 getchar
  • 关于在electron(Nodejs)中使用 Napi 的简单记录
  • 多模态融合的分类、跨模态对齐的方法
  • 练习:关于静态路由,手工汇总,路由黑洞,缺省路由相关
  • vue3 + xlsx 实现导入导出表格,导出动态获取表头和数据
  • Linux 离线部署Ollama和DeepSeek-r1模型
  • 零基础掌握Linux SCP命令:5分钟实现高效文件传输,小白必看!
  • IO学习---->线程
  • QT系列教程(20) Qt 项目视图便捷类
  • 『PostgreSQL』PGSQL备份与还原实操指南
  • 【测试框架篇】单元测试框架pytest(4):assert断言详解
  • 【Linux内核系列】:深入理解缓冲区
  • 《平面几何强化训练题集》第2章5到9题