問題
函數宣告返回類型為 long,詢問其含義及是否可改為 int。

直接回答
可改為 int,但返回值會被隱式截斷 (Truncation),可能導致數據丟失或錯誤。
long vs int 關鍵差異
| 特性 | long | int |
| C++ 標準最小位寬 | 32 位 | 16 位 |
| 典型 64 位系統 | 64 位 (LP64) 或 32 位 (LLP64/Windows) | 32 位 |
| 範圍 (64位 long) | ±9.22×10¹⁸ | ±2.14×10⁹ |
| 典型用途 | 時間戳、大文件偏移、ID、指標相關 | 一般計數、索引、旗標 |
改為 int 的風險場景
long getTimestamp() { return System.currentTimeMillis(); } // 13位數字
// 改為 int 後:2024年時間戳 ~1.7億 仍在 int 範圍內,但 2038年會溢位
long getFileSize() { return file.length(); } // 可能 > 2GB
// 改為 int:>2GB 文件會變負數/錯誤值
long ptrToLong(void* p) { return reinterpret_cast(p); }
// 改為 int:64位指標截斷高32位,極其危險
安全修改檢查清單
- 確認函數所有返回值範圍**永不超過**
INT_MAX (2,147,483,647)
- 確認所有調用處不依賴 > int 範圍的值
- 確認無指標/句柄/時間戳/大文件偏移等語義需求
- 加上
static_assert 或編譯期斷言防止未來變更破壞
現代 C++ 最佳實踐
- 定長整數:
int32_t, int64_t (<cstdint>) 明確位寬
- 語義類型:
std::intptr_t (指標)、std::time_t (時間)、std::size_t (大小)
- 避免裸
long:跨平台位寬不一 (Windows 64位 long=32位,Linux 64位 long=64位)
總結
long 表示「至少 32 位有號整數」,常用於需較大範圍的場景。**可改 int 但必須驗證數值範圍安全**。現代 C++ 應優先使用定長類型 (int32_t/int64_t) 或語義類型,避免平台差異導致的隱性 Bug。
- 上一篇文章: Android 離線激活授權:機器碼綁定充值卡算法設計與防破解策略
- 下一篇文章: Java char 陣列賦值:toCharArray() 與逐字符賦值兩種標準方法
Copyright ©
程式碼之家 All Rights Reserved