C 获取特定位数的值
1-1 逐位提取数字
获取对应位数的数字,适应开发过程中的各种操作,具体的代码演示案例如下所示
假设 val
是一个 5位整数(范围:0~99999),代码将逐位提取其数字,并存储到数组 g_Tempbuf
中:
g_Tempbuf[0] = val / 10000; // 提取万位(第5位)
g_Tempbuf[1] = (val % 10000) / 1000; // 提取千位(第4位)
g_Tempbuf[2] = (val % 1000) / 100; // 提取百位(第3位)
g_Tempbuf[3] = (val % 100) / 10; // 提取十位(第2位)
g_Tempbuf[4] = val % 10; // 提取个位(第1位)
1-2 实际分析
以 val = 12345
为例:万位
g_Tempbuf[0] = 12345 / 10000 = 1 // 整数除法,得到万位数字 1
千位(第4位):
val % 10000 = 12345 % 10000 = 2345 // 取余后保留后4位
2345 / 1000 = 2 // 整数除法,得到千位数字 2
百位(第3位):
val % 1000 = 12345 % 1000 = 345 // 取余后保留后3位
345 / 100 = 3 // 整数除法,得到百位数字 3
十位(第2位):
val % 100 = 12345 % 100 = 45 // 取余后保留后2位
45 / 10 = 4 // 整数除法,得到十位数字 4
个位(第1位):
val % 10 = 12345 % 10 = 5 // 直接取余,得到个位数字 5
最终,g_Tempbuf
的内容为:[1, 2, 3, 4, 5]
。
1-3 数组索引与位数
g_Tempbuf[0]
→ 万位(最高位)
g_Tempbuf[2]
→ 百位
g_Tempbuf[3]
→ 十位
g_Tempbuf[4]
→ 个位(最低位)
适用的范围是:
5位整数:如果 val
不足5位(例如 val = 123
),高位将补零。
例如:
val = 123
→ g_Tempbuf = [0, 0, 1, 2, 3]
超过5位:如果 val
超过5位(例如 val = 123456
),代码将截断高位。
例如:
val = 123456
→ g_Tempbuf[0] = 12
(实际是错误结果)
潜在问题:
前导零:不足5位时高位自动补零,需根据需求决定是否保留。
数值溢出:若 val
超过5位(如 val ≥ 100000
),高位计算结果可能不符合预期。
1-4 程序改进
使用循环或对数运算动态确定位数,避免硬编码除法:
for (int i = 0; i < 5; i++) {
g_Tempbuf[i] = val / (int)pow(10, 4 - i) % 10;
}
添加范围检查:
if (val > 99999) {
// 错误处理:数值超出范围
}
若需要忽略高位零,可记录有效位起始位置:
int start = 0;
while (start < 5 && g_Tempbuf[start] == 0) {
start++;
}
// 从 start 开始为有效数字
功能:
功能:将最多5位的整数按万位→个位顺序分解到数组中。
适用场景:固定位数显示(如数码管、LCD显示数值)。
注意事项:需确保输入值在合理范围内,并根据需求处理前导零和溢出问题。
......