當將 long 整型變數賦值給 short 整型變數時,涉及隱含類型轉換(縮小轉換),行為取決於編譯器實作與數值範圍。
大多數現代編譯器(GCC, Clang, MSVC)在高警告等級(如 -Wall、/W4)下會發出警告:「從 'long int' 轉換到 'short int' 可能改變值」,但不會報錯,編譯仍可通過。C 標準允許此隱含轉換,屬於實作定義行為。
long 數值在 short 範圍內(通常為 -32,768 ~ 32,767),數值保持不變。short 只保留 long 低 16 位,高位捨棄,導致數值變化(可能變負數或正數),不會產生運行時錯誤或例外。C 標準規定有號整數溢位行為為「實作定義」,但主流編譯器在二補數架構上行為一致:直接截斷位元。不過,嚴格來說不可依賴此行為,建議顯式轉換並加入範圍檢查:
long val = 100000;
if (val > SHRT_MAX || val < SHRT_MIN) { /* 處理錯誤 */ }
short s = (short)val; // 顯式轉換消除警告
總結:編譯通常通過(有警告),執行時超出範圍會截斷數據,不同編譯器在常見平台上行為一致,但標準不保證。