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

【13】单片机编程核心技巧:乘法运算

【13】单片机编程核心技巧:乘法运算

七律 · 乘法

乘法运算寄存间,溢出玄机隐字边。
连乘自增简写妙,移位替代速如仙。
中间变量扩疆土,长整型存避险关。
单片机中精算术,毫厘不爽展奇观。


摘要

乘法运算是单片机编程中提升数值计算效率的关键操作,广泛应用于比例缩放、信号处理及复杂算法等领域。本文系统阐述了乘法的语法规则、五种常用组合形式、溢出机制及优化策略,并结合实验验证了中间变量扩展和移位运算替代的实用性。研究表明,合理运用自乘简写、中间变量扩展及移位优化等技巧,可显著提升程序性能并规避溢出风险。
关键字:乘法运算,自乘简写,溢出,中间变量,移位优化


引言

在单片机编程中,乘法运算常用于比例缩放、信号处理等场景,但其计算复杂度较高且易引发溢出。本文结合具体案例,深入探讨乘法的实现原理、典型应用场景及优化方法,旨在为开发者提供高效可靠的解决方案。


1. 乘法运算基础

1.1 语法与组合形式

乘法语法格式为:

保存变量 = 乘数1 * 乘数2 * ... * 乘数N;  

根据乘数类型,可分为以下五种组合:

  1. 常量×常量a = 15 * 3;(结果为45)。
  2. 变量×常量b = x * 10;(若x=15,则b=150)。
  3. 变量×变量c = x * y;(若x=15y=6,则c=90)。
  4. 自乘(变量×常量)d = d * 2;(若初始d=18,则更新为36)。
  5. 自乘(变量×变量)e = e * x;(若e=2x=15,则更新为30)。

1.2 连乘与自乘简写

连乘支持多个乘数相乘:

a = 2 * 5 * 3; // 结果为30  

自乘可通过简写形式优化:

d *= 6; // 等价于 d = d * 6;  

2. 乘法优化与溢出处理

2.1 移位运算替代

乘以2的幂次可直接用左移操作替代,提升速度:

// 原代码  
a = a * 2; // 等价于左移1位  
a = a * 8; // 等价于左移3位  

// 优化后  
a <<= 1;  
a <<= 3;  

2.2 溢出机制与中间变量

当结果超过变量类型范围时,高位会被截断。例如:

unsigned char m = 30;  
unsigned char n = 10;  
unsigned char a = m * n; // 结果为44(溢出后仅保留低8位0x2C)。  

解决方案

  • 使用unsigned long中间变量扩展数值范围:
    unsigned long temp = (unsigned long)m * n;  
    a = (unsigned char)temp; // 显式截断或直接使用long类型存储。  
    

3. 实验验证

3.1 溢出实验

代码片段:

unsigned char a = 30;  
unsigned char b = 10;  
a = a * b; // 30×10=300 → 0x012C → 低8位0x2C(十进制44)。  

实验结果:

  • a的值为44(溢出截断)。

3.2 移位优化实验

代码片段:

unsigned char c = 5;  
c <<= 3; // 等价于5×8=40 → 二进制00101000。  

实验结果:

  • c的值为40(0x28),与直接乘法结果一致。

4. 结论

乘法运算在单片机编程中需平衡效率与可靠性。通过移位优化、中间变量扩展及合理选择数据类型,可有效规避溢出并提升计算速度。开发者应根据具体场景选择合适策略,确保程序在资源受限环境下高效稳定运行。

相关文章:

  • 《Python全栈开发》第2课:HTML骨架搭建 - 从零编写个人简历页面
  • 数字IC后端设计实现教程 |Innovus ICC2 Routing Pin Access Setting设置方法
  • 第十五届蓝桥杯大学B组(握手问题、小球反弹、好数)
  • ChatGPT课件分享(37页PPT)
  • 【亲测有效】Mac系统升级或降级Node.js版本,Mac系统调整node.js版本
  • 【3D视觉学习笔记1】针孔相机模型与坐标系变换
  • 【Azure 架构师学习笔记】- Azure Databricks (17) --Delta Live Table和Delta Table
  • 面试之《webpack从输入到输出经历了什么》
  • 基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求
  • GB8599-2023标准测试包/小规格测试包/标准生物测试包1.5kg/满负载织物7.5kg/不锈钢金属测试包/空腔负载试验的过程挑战装置(PCD)
  • Linux网络编程之——网络初认识
  • 启智畅想的集装箱号码识别技术,效率与技术的完美结合
  • [杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传
  • AF3 shaped_categorical函数解读
  • 大数据hadoop课程笔记
  • HTTPS协议原理:在Linux世界里的加密冒险
  • Jupyter Notebook 全平台安装与配置教程(附Python/Anaconda双方案)
  • Spring(3)—— 获取http头部信息
  • 如何创建一个Vue项目
  • 在Visual Studio 2022中实现Qt插件开发
  • 戴维·珀杜宣誓就任美国驻华大使
  • 央行行长:未来还可以扩大结构性货币政策工具规模或创设新的政策工具
  • 联合国秘书长吁印巴“最大程度克制”,特朗普:遗憾,希望尽快结束冲突
  • 这个接班巴菲特的男人,说不出一个打动人心的故事
  • 上海乐高乐园明天正式开售年卡,下月开启试运营
  • 美CIA发布视频“招募中国官员窃取机密”,外交部:赤裸裸的政治挑衅