K&R C vs ANSI C(数据类型提升)

  前面我们提到,当操作符的操作数类型不一致时,会发生类型转换,它负责把两个不同的操作数类型转换成

同一种普通操作类型,转换后的类型,一般也就是结果类型。

抛砖:

  printf (“%d”, sizeof ‘A’);

  这行代码打印出存储一个字符字面值类型的长度。你敢确定它的结果是 1 吗?运行一下试试。你会发现它的

结果是 4 (或者是你机器上int的长度)。字符常量的类型是int,根据提升规则,它由 char 转换为 int 。这个

概念在 K&R 中是这样描述的:

  在表达式中,每个 char 都被转换为 int ···注意所有位于位于表达式中的 float 都被转换为 double ···由于

函数参数也是一个表达式,所以当参数传递给函数时也会发生类型转换。具体地说, char 和 short 转换为 int

,而 float 转换为 double。

                              ——The C Programming Language, 第一版, P39

  这个特性被称为类型提升。当它发生于整型类型时称为“整型提升”。ANSI C 延续了自动类型提升的概念,

尽管在许多地方它已褪色。关于类型提升,ANSI C 有如下说明:

  在执行下列代码段时

  char c1,c2;

  /* ··· */

  c1 = c1 + c2;

  “整型提升”规则要求抽象机器把每个变量的值提升为 int 的长度,然后对两个 int 值执行加法运算,然后再

对运算结果进行裁剪。如果两个 char 的加法运算结果不会发生溢出异常,那么在实际执行时只需要产生 char

类型的元算结果,可以省略类型提升。

  类似,在下列代码段中

  float f1,f2;

  double d;

  /* ··· */

  f1 = f2 * d;

  如果编译器可以确定用 float 进行运算的结果跟转换为 double 后进行运算(例如,d 由类型为 double

的常量 2.0 所代替)的结果一样,那么也可以使用 float 来进行乘法运算。

                                           ——ANSI C 标准,第5.1.2.3节

C语言中的类型提升
源类型 通常提升后的类型
char int
位段(bit - field) int
枚举(enum) int
unsigned char int
short int
unsigned short int
float double
任何数组 相应类型的指针

  整型提升就是 char、short int 和位段类型(无论 signed 或 unsigned)以及枚举类型将被提升

为 int ,前提是 int 能够完整的容纳原先的数据,否则将被转换为 unsigned int 。ANSI C 表示如果

编译器能够保证运算结果一致,也可以省略类型提升——这通常出现在表达式中存在常量操作数的时候。

原文地址:https://www.cnblogs.com/luzhiyuan/p/3617224.html