在下面的代码块中,7语句的if语句中发生的impicit转换是什么?虽然它最终会成为(0x98 <= 0x07),但是当条件评估为真并且调用DoMyStuff时,情况并非如此.
char minstogo = 0x98;
if(minstogo <= 7) {
DoMyStuff();
}
Run Code Online (Sandbox Code Playgroud)
Ada*_*eld 16
只要+ - * / % << >> & | ^ == != < <= > >=在两个不同类型的整数操作数之间有二元运算符(其中之一),就会在执行运算之前将这两种类型转换为公共类型.决定转换类型的规则是(来自C99标准的第6.3.1.8节):
如果两个操作数具有相同的类型,则不需要进一步的转换.
否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型.
否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,然后用带符号的整数类型的操作数被转换成无符号整数类型的操作数的类型.
否则,如果用符号整型操作数的类型,可以表示所有与无符号整数类型的操作数的类型的值的,然后用无符号整数类型的操作数被转换成符号整型操作数的类型.
否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型.
在这种情况下,char可以是有符号或无符号整数类型 - 其签名是实现定义的.幸运的是,a int表示a的所有可能值char,无论是否char有符号,假设您所在char的系统中s为8位且ints至少为16位.
如果char是有符号的,则上面的第二段适用,因此两个操作数都被转换为int(具有较高等级的类型;等级以稍微复杂的方式定义,但它基本上等于该类型的位大小).由于0x98(作为有符号char)是负数,因此它被转换为整数-104,然后小于7.
如果相反char是未签名的,那么第四段适用.unsigned char将转换为152 int,大于7.
不要依赖于char签名或未签名.如果你需要一个特定的符号性的8位整数,明确使用signed char或unsigned char,或使用C99的类型int8_t和uint8_t定义INT <stdint.h>.
很容易被整数提升规则引起的细微错误所困扰.我强烈建议你总是-Wall使用gcc进行编译,这会警告你有关有符号和无符号整数之间的比较,这通常是导致错误的原因.