【14】单片机编程核心技巧:整除运算与数位提取
【14】单片机编程核心技巧:整除运算与数位提取
七律 · 整除玄机
整除根基运算行,数位提取显真明。
先商后余避溢险,先余后商需谨精。
除零溢出当留意,类型扩展保程成。
实验验证真理现,编程妙用万象生。
🌟 目录
- 整除求商
- 整除求余
- 数位提取:先余后商 vs 先商后余
- 实验验证与代码示例
- 实践建议与注意事项
📌 1. 整除求商(/
)
🔹 基本规则
- 运算符号:
/
返回商的整数部分,舍弃小数。 - 适用类型:
unsigned char
,unsigned int
,unsigned long
(不支持浮点数)。
🔹 特殊情况分析
场景 | 结果 | 示例 |
---|---|---|
除数为0 | - 变量0:商为255 (unsigned char )或最大值(其他类型)。- 常量0:商为 1 (编译警告)。 | a = 23/y; (y=0 → a=255 ) |
被除数 < 除数 | 商为0 。 | c = 7/10; → c=0 |
被除数 = 除数 | 商为1 。 | d = 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=0 → a=23 ) |
被除数 < 除数 | 余数等于被除数。 | c = 7%10; → c=7 |
被除数 = 除数 | 余数为0 。 | d = 10%10; → d=0 |
被除数 > 除数 | 余数 < 除数。 | e = 10%4; → e=2 |
除数为1 | 余数始终为0 。 | g = 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);
}
🔹 实验结果
变量 | 先余后商结果 | 先商后余结果 |
---|---|---|
a | 8 | 8 |
b | 5 | 5 |
e | - | 8 |
f | - | 5 |
⚠️ 实践建议与注意事项
-
除数为0的处理:
- 避免除数为0,但若无法避免,需了解其行为(如变量0的商为255)。
- 变量除以常量0会导致编译失败(如
b = k % 0
)。
-
溢出风险:
- 使用
unsigned long
类型可扩展数值范围,降低溢出概率。
- 使用
-
代码安全:
- 在除法前检查除数是否为0(如
if (divisor != 0)
)。
- 在除法前检查除数是否为0(如
-
数位提取优化:
- 使用宏定义封装逻辑,提高复用性:
#define EXTRACT_DIGIT(n, pos) ((n / pos) % 10)
- 使用宏定义封装逻辑,提高复用性:
-
调试技巧:
- 通过串口输出或LED闪烁验证运算结果。
🌟 总结
整除运算与数位提取是单片机编程的核心技能:
- 求商与求余 是基础,需注意除数为0和溢出风险。
- 数位提取 中,“先商后余”更可靠,尤其在处理大数值时。
终极原则:
“谨慎处理除数,合理选择类型,实验验证行为!”