响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:c:tips:binary_conversions

二元转换(Binary conversions)

二元转换发生在二元操作符的两个操作数以及条件表达式的第二、第三操作数。

进行二元转换之前,每个操作数先独立的进行一元转换,之后,如果尚需转换的话,再进行二元转换。

二元转换的基本规则是小类型转换为大类型,比如一个操作数是long double,则另一个操作数也转换成long double,依次类推。唯一的例外是有符号整数(signed)和无符号整数(unsigned)混合的时候,具体规则如下:

  • 有符号整数的级别等于或小于无符号类型的级别时,转换成该无符号类型;
  • 有符号整数的级别大于无符号类型的级别时,又分两种情况:
    • 如果有符号类型能容纳无符号类型的所有值,则转换成该有符号类型(Traditional C转换成该有符号类型对应的无符号类型);
    • 如果有符号类型无法容纳无符号类型的所有值,则转换成该有符号类型对应的无符号类型。

一元转换类似,标准C与Traditional C在涉及无符号整数的规则上有区别,要特别小心。

例如,下面的代码在两种标准的编译器上编译运行,将获得不同的结果:

#include <stdio.h>
#include <stdlib.h>
 
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);
}
computer/c/tips/binary_conversions.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1