zoukankan      html  css  js  c++  java
  • 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 表示如果

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

  • 相关阅读:
    洛谷P1501 动态树(LCT)
    Beijing Institute of Technology 2019.6 Monthly Contest (For grade 2018)
    [BJOI2018]求和
    [JSOI2015]最小表示
    简单题
    [Ynoi2016]掉进兔子洞
    乘积
    飞扬的小鸟
    [CTSC2008]网络管理
    Sequence
  • 原文地址:https://www.cnblogs.com/luzhiyuan/p/3617224.html
Copyright © 2011-2022 走看看