我们都知道,C语言中的基本数据类型都分为 有符号型,和无符号型, 分别用signed 和 unsigned 来表示。一般情况下, 对于有符号类型, 声明时可以省略掉前面的signed, int i 等价于 signed int i. 星星一直以为所有数据类型,在所有的情况都适用此省略规则,直到前两天在ADS上编译一段程序时遇到了一个“灵异的问题“:
定义了一个变量 char ch = -5 ; 可以是编译器却给出了警告, 并且其后的代码中 if( ch < 0 ) 结果为假! 这段代码在vc上面编译是没有问题的。 后来在网上查了一些资料,原来是这样: 对于 char ch 这样的定义 C语言标准并没有强制规定它的是一个有符号数还是无符号数,不同的编译器可以有不同的实现。ADS 认为 char ch 是要定义一个无符号数即 unsigned ch = -5 ,所以会给警告,并且后续的代码工作不正常, 而vc默认 char 为 signed char, 所以没有问题。
解决方法
1. 使用自己定义的数据类型, 在不同平台上只需要重新编译代码
#if defined ( ADS )
typedef signed char CHAR;
#else
typedef char CHAR;
#endif
2. 修改编译器设置
VC可以使用 /J 指令将默认的char类型定义成 unsigned char
ADS 可以使用 --signed_chars 参数来将默认的 char 类型定义为 signed char
3. 除非必要,不要使用 char 类型。