C 語言類型轉換(顯式/隱式)均涉及「中間變量」,原數據不變。本文通過 GCC 實測揭示 sizeof 操作對象、char 溢出轉換、單引號多字符常量的編碼規則與警告分級。
printf("%d %d\n", 'a', sizeof((int)'a')); // 97, 4
// sizeof 作用於 int 類型中間變量,非原字符常量
char c = 255; // 假設有符號 char,溢出為 -1
printf("%d\n", c); // -1
// 隱式轉換為 int 參與 printf,值保持 -1
結論:轉換產生臨時變量,原對象類型/值不變。
GCC 編譯通過,僅警告:
'1' // 49 (0x31) '12' // 12594 (0x3132) 警告:multi-character character constant '123' // 3224115 (0x313233) 警告:同上 '1234' // 825373492 (0x31323334) 警告:同上 '12345' // 842216501 警告:character constant too long for its type '123456' // 859059510 警告:同上 '1234567'// 875902519 警告:同上 '12345678'// 892745528 警告:同上 '123456789'// 909588537 警告:同上
'12' → 低位字節 0x32('2')、次低 0x31('1') → 0x3132 = 12594'1234' → 0x31323334 正好填滿 4 字節 int'12345')→ **截取低 4 字節** '2345' (0x32333435),警告升級為 too long for its type0x31('1')、0x32('2') 等多字符常量類型為 int,作為 printf("%d") 參數無需轉換。若賦值給 char 會截斷;作為 short 參數會擴展/截斷。
int,小端序編碼,超長截斷低位問:
(char *)&val是強制類型轉換嗎?
答:是。告訴編譯器將&val視為char*,讀取低位字節。32 位系統int4 字節,轉char*後ptr++步長 1 字節。標準寫法(char)val或char(val)。問:
(double)k/m轉換哪個?
答:轉換緊跟其右的操作數。(double)(k/m)先整除再轉;(double)k/m先轉k再浮點除。二元運算自動提升低精度操作數。
sizeof 作用於轉換後的中間變量類型multi-character → too long