代码里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 。然后程序中不直接用char,而用明确制定signed和unsigned的新类型来定义变量,这就消除了char的默认符号带来的问题。