cout << 3751 * 3751 * 3751 << endl; // 輸出錯誤值(如 -130...)
cout << pow(3751, 3) << endl; // 輸出正確值
long long a = 3751;
cout << a * a * a << endl; // 輸出正確值
| 表達式 | 類型推導過程 | 結果 |
|---|---|---|
3751 * 3751 * 3751 | 字面值 `3751` 是 `int` (32位) → 相乘過程全程 `int` 運算 → 溢出 (超過 2^31-1) → 未定義行為/環繞 | 錯誤 |
pow(3751, 3) | `pow(double, double)` → 參數隱式轉 `double` (64位浮點) → 浮點運算無溢出 → 返回 `double` | 正確 (近似值) |
long long a=3751; a*a*a | 變量 `a` 是 `long long` (64位) → 運算提升為 `long long` → 64位整數運算無溢出 | 正確 (精確值) |
// 1. 字面值加後綴強制類型
cout << 3751LL * 3751 * 3751 << endl; // 首個 LL 提升全表達式
// 2. 使用變量承接(推薦,語義清晰)
long long base = 3751;
cout << base * base * base << endl;
// 3. 大數精確運算用專用庫
// boost::multiprecision::cpp_int big = 3751;
# big = big * big * big; // 任意精度
字面值不帶後綴就是 `int`,`int` 運算溢出不可靠。 只要涉及可能超出 21 億的整數計算,聲明 `long long` 變量或加 `LL` 後綴,將類型鎖定在 64 位,從源頭杜絕溢出 Bug。