====== 二元转换(Binary conversions) ====== 二元转换发生在二元操作符的两个操作数以及条件表达式的第二、第三操作数。 进行二元转换之前,每个操作数先独立的进行[[.:unary_conversions|一元转换]],之后,如果尚需转换的话,再进行二元转换。 二元转换的基本规则是小类型转换为大类型,比如一个操作数是long double,则另一个操作数也转换成long double,依次类推。唯一的例外是有符号整数(signed)和无符号整数(unsigned)混合的时候,具体规则如下: * 有符号整数的级别等于或小于无符号类型的级别时,转换成该无符号类型; * 有符号整数的级别大于无符号类型的级别时,又分两种情况: * 如果有符号类型能容纳无符号类型的所有值,则转换成该有符号类型(**Traditional C转换成该有符号类型对应的无符号类型**); * 如果有符号类型无法容纳无符号类型的所有值,则转换成该有符号类型对应的无符号类型。 与[[.:unary_conversions|一元转换]]类似,标准C与Traditional C在涉及无符号整数的规则上有区别,要特别小心。 例如,下面的代码在两种标准的编译器上编译运行,将获得不同的结果: #include #include int main(void) { if (-1 < (unsigned char)1) printf("-1 is less than (unsigned char)1: ANSI semantics.\n"); else printf("-1 NOT less than (unsigned char)1: K&R semantics.\n"); exit(0); } {{tag>C语言}}