C语言整数除法/截断向零,如-7/3得-2;%取余符号同被除数,满足(a/b)*b+(a%b)==a,且两操作数须为整型。

整数除法 / 的结果到底怎么算
在 C 语言中,当两个操作数都是整数时,/ 执行的是**截断向零的整数除法**,不是四舍五入,也不是向下取整。比如 7 / 3 得 2,-7 / 3 得 -2(不是 -3),7 / -3 也是 -2,-7 / -3 是 2。
关键点:
- 只要两边都是整型(
int、long等),/就丢弃小数部分,只保留整数商 - 如果其中一个是浮点数(如
7.0 / 3),结果就是浮点除法,得到2.333... - 除零行为未定义,运行时可能崩溃或产生信号(如
SIGFPE)
% 取余运算必须满足的数学关系
C 语言的 % 不是“取模”,而是“取余”,它和 / 共享同一个规则:余数符号与被除数一致,并满足恒等式:(a / b) * b + (a % b) == a(前提是 b != 0)。
所以这些结果不是偶然:
立即学习“C语言免费学习笔记(深入)”;
-
7 % 3→1 -
-7 % 3→-1(因为-7 / 3是-2,而(-2)*3 + (-1) == -7) -
7 % -3→1(7 / -3是-2,(-2)*(-3) + 1 == 7) -
-7 % -3→-1(同理)
注意:% 要求两个操作数都必须是整型,不能对浮点数使用,否则编译报错:invalid operands to binary %。
为什么 -7 % 3 不等于 2(像 Python 那样)
这是 C 标准明确规定的余数符号规则——**余数符号 = 被除数符号**。Python 的 % 是真正取模(结果非负),而 C 的 % 是取余,更贴近硬件除法指令的行为(如 x86 的 idiv)。
如果你需要类似 Python 的非负余数,得手动调整:
int mod(int a, int n) {
int r = a % n;
return r < 0 ? r + n : r;
}
// mod(-7, 3) → 2
但要注意:这个函数仅在 n > 0 时安全;若 n 可能为负,需额外判断。
混用 / 和 % 时最容易忽略的边界
实际写循环、分页、数组索引时,很多人直接套用 i / N 和 i % N,却忘了负数索引或除数为 1 的情况:
- 当
b == 1或b == -1,a % b总是0(除非a本身溢出) - 当
a是最小负数(如INT_MIN),且b == -1,a / b会溢出(有符号整数溢出是未定义行为) -
%对负除数的结果容易误判,尤其做哈希或环形缓冲时,建议统一转为正除数再算
真正麻烦的从来不是语法,而是你默认“余数一定非负”那一刻——C 不认这个默认。











