首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言中 long 型別賦值給 short 型別的編譯與執行行為分析

     編輯:程式設計綜合問答

當將 long 整型變數賦值給 short 整型變數時,涉及隱含類型轉換(縮小轉換),行為取決於編譯器實作與數值範圍。

編譯階段

大多數現代編譯器(GCC, Clang, MSVC)在高警告等級(如 -Wall、/W4)下會發出警告:「從 'long int' 轉換到 'short int' 可能改變值」,但不會報錯,編譯仍可通過。C 標準允許此隱含轉換,屬於實作定義行為。

執行階段

  • 若 long 數值在 short 範圍內(通常為 -32,768 ~ 32,767),數值保持不變。
  • 若超出範圍,發生截斷:只保留低位位元。例如 16 位元 short 只保留 long 低 16 位,高位捨棄,導致數值變化(可能變負數或正數),不會產生運行時錯誤或例外。

跨編譯器一致性

C 標準規定有號整數溢位行為為「實作定義」,但主流編譯器在二補數架構上行為一致:直接截斷位元。不過,嚴格來說不可依賴此行為,建議顯式轉換並加入範圍檢查:

long val = 100000;
if (val > SHRT_MAX || val < SHRT_MIN) { /* 處理錯誤 */ }
short s = (short)val; // 顯式轉換消除警告

總結:編譯通常通過(有警告),執行時超出範圍會截斷數據,不同編譯器在常見平台上行為一致,但標準不保證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved