c++整数除法结果为int,小数部分直接截断而非四舍五入;5/2得2,-7/3和7/-3均向零截断得-2;(double)(a/b)无效,应写为(double)a/b;除零是未定义行为,须显式检查。

因为 C++ 规定:两个 int 相除,结果必须是 int,小数部分被截断(不是四舍五入,是直接丢弃)——这是语言标准行为,不是 bug,也不是编译器差异。
为什么 5 / 2 得到的是 2 而不是 2.5
运算符 / 的行为取决于操作数类型。当左右都是整型(如 int、long),C++ 强制执行整数除法,只计算商的整数部分。整个过程不涉及浮点寄存器,也不生成小数中间值。
-
5 / 2→ 先算数学结果 2.5,再按整型语义截断为2 -
-7 / 3→ 截断向零,结果是-2(不是 -3) -
7 / -3→ 同样向零,结果仍是-2 - 这个规则在所有标准 C++ 编译器(g++、clang、MSVC)和所有平台下完全一致
(double)(a / b) 为什么无效
括号位置错了:类型转换发生在除法之后,小数早已丢失。
- 写成
(double)(a / b):先执行a / b(整除得2),再转成2.0 - 正确写法是
(double)a / b或a / (double)b:让至少一个操作数变成浮点,触发浮点除法 - 若
a或b是表达式(如vec.size()),务必加括号:(double)(vec.size()) / n,否则(double)vec.size() / n可能因优先级出错
除零和负数取模的隐性风险
整数除零不是“返回错误值”,而是未定义行为——多数情况下直接崩溃(SIGFPE),且无法用 try/catch 捕获。
- 必须显式检查:
if (b != 0) { result = (double)a / b; } - 负数取模符号依赖实现(
a % b的符号在 C++11 前不统一),若逻辑依赖余数符号(比如做循环索引),建议改用std::div或手动标准化 -
static_cast<double>(a) / b</double>比 C 风格(double)a / b更安全,尤其在模板中可避免宏干扰
最容易被忽略的其实是除零检查和类型提升顺序——这两个点一旦漏掉,程序可能在某个输入下静默出错或直接终止,而不是报错信息明确的编译失败。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











