1. 程式人生 > >C陷阱篇之char的預設符號

C陷阱篇之char的預設符號

    程式碼裡char c;這樣的定義很少有人會留意,可就是這麼個簡單的定義卻有很大的隱患。所有C原始型別中,char比較特殊,其他如long, int, short都預設有符號,相當於signed long, signed intsigned 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而不明確指明signedunsigned是危險的,可能因有符號和無符號的“意外”轉換而發生錯誤。保險做法是用typedef定義新型別,明確指明符號,如:  #typedef   unsigned char  u8          #typedef   signed char     s8   。

然後程式中不直接用char,而用明確制定signed和unsigned的新型別來定義變數,這就消除了char的預設符號帶來的問題。