double赋值给int会向零截断小数部分,如3.14→3、-3.9→-3;大括号初始化禁止窄化转换而报错;隐式算术运算易引发整数溢出;需精度控制时应显式调用round/floor等函数。

double 赋值给 int 会静默截断小数部分
直接写 int x = 3.14; 是合法的,编译器默认只发警告(如 GCC 的 -Wconversion),不报错。值会被向零截断:3.14 → 3,-3.9 → -3。这不是四舍五入,也不调用任何函数,就是二进制位直接丢弃小数部分。
用大括号初始化({})会触发编译错误
这是 C++11 引入的“列表初始化”行为,对窄化转换(narrowing conversion)做严格检查。写 int x{3.14}; 或 std::vector<int> v{3.14};</int> 会直接编译失败,报错类似:error: narrowing conversion of '3.14000000000000012434497875801753282547e+00' from 'double' to 'int' inside { }。它强制你面对类型失真问题。
隐式转换 + 算术运算可能引发整数溢出
真正危险的不是单次赋值,而是中间计算阶段的隐式转换。比如:
int sum = 2147483647; // INT_MAX int sumB = -2147483648; // INT_MIN double result = sum - sumB; // 先算 int 减法 → 溢出!再转 double
这里 sum - sumB 在 int 范围内根本无法表示(结果是 4294967295),导致未定义行为。正确做法是提前升到 double:
double result = static_cast<double>(sum) - static_cast<double>(sumB);</double></double>- 或更简洁:
double result = (double)sum - sumB;(C 风格也行,但static_cast更明确)
需要保留精度或控制舍入时,别依赖隐式转换
如果你本意是四舍五入、向下取整或避免负数截断异常,int x = d; 完全不可靠。应显式调用标准库函数:
- 四舍五入:
int x = static_cast<int>(std::round(d));</int> - 向下取整(floor):
int x = static_cast<int>(std::floor(d));</int> - 向零取整(等价于默认截断):
int x = static_cast<int>(d);</int>—— 但至少你写了 cast,意图明确
最易被忽略的是:窄化转换在模板代码或 STL 算法中往往藏得更深,比如 std::accumulate(v.begin(), v.end(), 0) 中的 0 是 int,若 v 是 vector<double></double>,整个累加过程会在 int 上做隐式降级,结果早就不对了——这种地方连警告都未必有。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











