文章目录
前言
前段时间使用到了整数除法,被除数与除数都是正整数时熟悉的很,但是被除数与除数有一个或者两个都是负数时,自己有点蒙,记录一下。
C++ 中的整数除法是指操作数均为整数类型时的除法运算,其结果遵循严格的规则,核心为向零取整。以下是对 C++ 整数除法的全面解析:
一、核心规则:向零取整(C++11 及以后)
C++11 标准明确规定:整数除法的结果需向零取整(Truncation towards zero),即直接截断小数部分,保留整数部分,最终结果更靠近零点。
数学定义
对于实数 x,向零取整的结果 trunc(x) 满足:
- 若
x>=0:trunc(x)向下取整,如 2.33 → 2; - 若
x< 0:trunc(x)向上取整,如 -2.33 → -2。
二、不同符号组合的除法结果
整数除法的结果(商)和余数受操作数符号影响,具体如下:
1. 商的计算(向零取整)
| 操作数符号组合 | 数学结果示例 | 向零取整后的商 | 说明 |
|---|---|---|---|
| 正 ÷ 正 | ( 7 ➗ 3 = 2.33 ) | 2 | 正数,截断小数得 2 |
| 正 ÷ 负 | ( 7 ➗ (-3) = -2.33 ) | -2 | 负数,截断小数得 -2(向零靠近,非 -3) |
| 负 ÷ 正 | ( (-7) ➗ 3 = -2.33 ) | -2 | 负数,截断小数得 -2(向零靠近,非 -3) |
| 负 ÷ 负 | ( (-7) ➗ (-3) = 2.33 ) | 2 | 正数,截断小数得 2 |
2. 余数的计算(符号与被除数一致)
C++ 中余数运算(%)满足数学恒等式:
被除数=除数×商+余数,且余数的符号与被除数相同。
| 表达式 | 商(向零取整) | 余数计算过程 | 最终余数 | 验证恒等式 |
|---|---|---|---|---|
7 / 3 | 2 | ( 7 - 3 × 2 = 1 ) | 1 | ( 3 × 2 + 1 = 7 ) ✔️ |
7 / -3 | -2 | ( 7 - (-3) × (-2) = 1 ) | 1 | ( (-3) × (-2) + 1 = 7 ) ✔️ |
-7 / 3 | -2 | ( -7 - 3 × (-2) = -1 ) | -1 | ( 3 × (-2) + (-1) = -7 ) ✔️ |
-7 / -3 | 2 | ( -7 - (-3) × 2 = -1 ) | -1 | ( (-3) × 2 + (-1) = -7 ) ✔️ |
三、与其他取整方式的对比
最易混淆的是向下取整(floor),二者的核心区别在于负数处理:
- 向零取整:向零点靠近(如 ( -2.33 → -2 ));
- 向下取整:向负无穷靠近(如 ( -2.33 → -3 ))。
例如:
- ( -10 ➗ 8 ) 的数学结果是 ( -1.25 );
- 向零取整:
-1(C++ 整数除法结果); - 向下取整:
-2(数学 floor 函数结果)。
- 向零取整:
四、特殊情况
1. 除以零
整数除法中,除数为零会导致未定义行为(Undefined Behavior),程序可能崩溃或产生不可预测结果。例如:
int a = 5 / 0; // 未定义行为,编译可能通过但运行时崩溃
2. 整数溢出
整数除法的溢出风险极低,仅在极端情况下可能发生(如 INT_MIN / -1,因 INT_MIN 绝对值比 INT_MAX 大 1,结果超出 int 范围)。
五、与浮点数除法的区别
当操作数中存在浮点数时,C++ 会进行隐式类型转换,结果为浮点数(遵循浮点数除法规则,无截断)。
| 表达式 | 操作数类型 | 结果类型 | 结果 | 说明 |
|---|---|---|---|---|
7 / 3 | 均为 int | int | 2 | 整数除法,向零取整 |
7.0 / 3 | double + int | double | 2.333... | 浮点数除法,无截断 |
7 / 3.0 | int + double | double | 2.333... | 浮点数除法,无截断 |
六、代码示例
以下代码展示了不同符号组合下的整数除法和余数结果:
#include <iostream>
using namespace std;
int main() {
// 正 ÷ 正
cout << "7 / 3 = " << 7 / 3 << ", 7 % 3 = " << 7 % 3 << endl; // 输出:2, 1
// 正 ÷ 负
cout << "7 / -3 = " << 7 / -3 << ", 7 % -3 = " << 7 % -3 << endl; // 输出:-2, 1
// 负 ÷ 正
cout << "-7 / 3 = " << -7 / 3 << ", -7 % 3 = " << -7 % 3 << endl; // 输出:-2, -1
// 负 ÷ 负
cout << "-7 / -3 = " << -7 / -3 << ", -7 % -3 = " << -7 % -3 << endl; // 输出:2, -1
// 特殊值
cout << "-10 / 8 = " << -10 / 8 << ", -10 % 8 = " << -10 % 8 << endl; // 输出:-1, -2
return 0;
}
七、总结
C++ 整数除法的核心要点:
- 向零取整:截断小数,靠近零点(C++11 及以后的强制标准);
- 余数规则:余数符号与被除数相同,满足恒等式
被除数 = 除数×商 + 余数; - 符号影响:商的符号由操作数符号决定,余数符号与被除数一致;
- 除以零:未定义行为,需避免;
- 类型区分:仅当操作数均为整数时才是整数除法,否则为浮点数除法。
理解这些规则有助于准确预测整数除法的结果,避免因符号或取整方式导致的逻辑错误。
984

被折叠的 条评论
为什么被折叠?



