首先看下程序的运行结果:
在C语言中,1 代表条件为真,即 (char)-1>2 是成立的,我们知道 -1 一定是小于 2 的,但为什么 (char)-1>2 是成立的呢?
原因
C 语言标准 对 char 是 没有明确定义的,char 默认是 signed char 还是 unsigned char ,是由编译器决定的:
- msvc、x86-gcc 都把
char 定义为 signed char - arm-linux-gcc、arm-gcc、MDK编译器 却把
char 定义为 unsigned char
因为上图使用了 Keil 编译程序,而 Keil 的编译器是 MDK编译器 ,它把 char 视为了 unsigned char ,而整数在未指定类型的情况下默认是 int 类型,当 (unsigned char)-1 和 (int)2 进行运算时,会先将位数较小的 unsigned char 转为 int 类型,而 (unsigned char)-1 转为 int 型 的结果是 255 ,所以 (char)-1 > 2 才会成立。
总结
在使用 char 运算的时候,要使用 signed char 、 unsigned char 显式声明 char ,或直接使用 int8_t 、uint8_t 。
|