C陷阱篇之char的預設符號
阿新 • • 發佈:2019-01-25
程式碼裡char c;這樣的定義很少有人會留意,可就是這麼個簡單的定義卻有很大的隱患。所有C原始型別中,char比較特殊,其他如long,
int, short都預設有符號,相當於signed long, signed int和signed short,只有“char”不確定。某些編譯器預設char是有符號的signed
char,有些又當作unsigned char處理。例如ARM編譯器ADS中,有編譯選項(plain
char is signed),選定此選項,ADS就把char當作signed
char,不選定就預設unsigned char。不同的編譯器選項會導致某些程式執行結果完全不同 。
比如:
char c = -1;
if(c>=0) ......
考慮下,如果編譯器把char c認為是signed char c,那c = -1沒問題。但如果是unsigned char c,那c = -1賦值後,c實際等於多少?c>=0是否成立呢?
所以直接用char而不明確指明signed和unsigned是危險的,可能因有符號和無符號的“意外”轉換而發生錯誤。保險做法是用typedef定義新型別,明確指明符號,如: #typedef unsigned char u8 #typedef signed char s8 。