声明int变量应优先用整数字面量初始化,避免浮点或超范围值;跨平台选int或int64_t而非long;推荐使用{}初始化以禁止窄化转换;小整型参与运算会自动提升为int。

怎么声明一个 int 变量,不踩类型隐式转换的坑
直接写 int x = 10; 没问题,但很多人在初始化时用浮点字面量或大整数,结果编译通过却行为异常。比如 int y = 3.14; 会静默截断为 3,没有警告;int z = 10000000000;(超 INT_MAX)可能触发未定义行为。
- 初始化尽量用整数字面量,避免小数点或科学计数法
- 不确定范围时,先查
std::numeric_limits<int>::max(),别硬记值 - 启用编译器警告:
-Wconversion(GCC/Clang)能捕获隐式截断 - 需要明确截断意图?显式写成
int y = static_cast<int>(3.14);
long、long long、int 到底该选哪个
不是“越长越好”。int 在多数现代平台是 32 位,够用且运算快;long 在 Windows 上仍是 32 位(LLP64),Linux/macOS 是 64 位(LP64),跨平台时容易出错;long long 稳定是至少 64 位,但体积和运算开销略高。
- 计数、数组索引、一般循环变量:优先用
int或size_t(配std::vector::size()等) - 需要 ≥64 位精确整数(如时间戳、大ID):用
int64_t(来自<cstdint>),比long long更明确 - 别用
long做跨平台整数——它在不同系统上宽度不一致 - 函数参数中接收容器大小?必须用
size_t,否则和.size()类型不匹配会触发 signed/unsigned 警告
char、short 这些“小整型”能不能当普通整数用
能声明,但几乎不该这么用。C++ 中 char、short 在算术表达式中会自动提升为 int(整型提升规则),你写的 short a = 1, b = 2; auto c = a + b;,c 的类型其实是 int,不是 short。
- 存大量数据且内存敏感(如图像像素)?用
uint8_t/int16_t,并清楚它们只是存储载体 - 做计算?一律提升到
int或更大,别指望short运算更快——现代 CPU 对 32 位操作最友好 -
char专门用于字符或字节操作;拿它存小整数易混淆语义,也容易和signed char/unsigned char符号问题纠缠
初始化方式差异:=、{}、() 有什么实际影响
三种写法在整型上大多等效,但 {}(统一初始化)有关键约束:它禁止窄化转换(narrowing conversion)。这能帮你提前发现危险赋值。
立即学习“C++免费学习笔记(深入)”;
-
int a = 3.14;→ 静默截断 -
int b{3.14};→ 编译错误! -
int c(3.14);→ 也静默截断(与=行为一致) - 推荐日常用
int x{42};,尤其在类成员初始化、模板推导场景下更安全 - 注意:
int y{};是零初始化(值为 0),而int z;是未初始化(值随机)——这点常被忽略
整型看似简单,但类型选择、初始化写法、跨平台宽度、隐式提升这些点,一旦组合起来就容易埋雷。最常被跳过的其实是检查 sizeof(int) 和 std::numeric_limits<T>::digits——别凭经验猜,运行时看一眼最稳。










