【问题标题】:Usual arithmetic conversions in C : Whats the rationale behind this particular ruleC 中的常用算术转换:这个特定规则背后的基本原理是什么
【发布时间】:2012-01-20 06:41:44
【问题描述】:

来自 k&R C

  • 首先,如果任一操作数为 long double,则另一个将转换为 long double。
  • 否则,如果任一操作数为双精度,则另一个将转换为双精度。
  • 否则,如果任一操作数为浮点数,则另一个将转换为浮点数。
  • 否则,对两个操作数都执行整数提升; ...

这意味着下面的表达式

char a,b,c;

c=a+b;

实际上计算为

c = char((int)a+(int)b);

这条规则背后的基本原理是什么?

如果 a、b 和 c 都很短,这些转换会发生吗?

【问题讨论】:

    标签: c integer-promotion


    【解决方案1】:

    不,这实际上不是真的。 C99 部分 5.1.2.3 Program execution,第 10 条涵盖完全您询问的情况:

    示例 2
    在执行片段
    char c1, c2;
    c1 = c1 + c2;
    “整数提升”要求抽象机将每个变量的值提升为 int 大小,然后将两个 int 相加并截断总和。

    如果两个字符的添加可以在没有溢出的情况下完成,或者溢出包装静默产生正确的结果,实际执行只需要产生相同的结果,可能会省略促销。

    因此,如果已知该操作会产生相同的结果,则无需使用更宽的值。

    但是,如果您想了解标准中特定决定背后的基本原理,您必须查看,..... 等待它,..... 是的,Rationale document :-)

    在该理由的第 6.3.1.8 节(部分与标准中的部分相匹配)中,它指出:

    添加了显式许可证以执行比绝对必要的“更宽”类型的计算,因为这有时可以生成更小更快的代码,更不用说更频繁地正确答案了。

    只要获得相同的最终结果,也可以通过 as if 规则以“更窄”的类型执行计算。

    【讨论】:

    • 所以只要实现确保 'char((int)a+(int)b)' 和 'a+b' 是相同的促销可以省略?
    • 谢谢,这回答了我的问题
    • 应该提到标准的引用部分涵盖了程序流程和可能的优化。最好假设发生了整数提升,否则您可能会遇到错误。以(c1+c2) / c3 为例,其中 c1+c2 可能会溢出。编译器无法优化那里的促销,因为它会给出不同的结果。
    【解决方案2】:

    一些指令集架构没有任何算术机指令来处理少于一个字的整数(如shortchar)。因此,要求该约定使编译器的事情变得更简单。而且大多数情况下,转换为 word 并在 word 大小的操作数上进行操作就足够了。

    【讨论】:

      【解决方案3】:

      如果 a、b 和 c 都很短,这些转换会发生吗?

      是的,整数提升适用于所有小整数类型:char、short 和 C99 bool。

      严格来说,C 程序不能对小于 int 的任何东西执行任何形式的算术运算,除非编译器优化掉整数提升。

      【讨论】:

        猜你喜欢
        • 2019-05-26
        • 2011-06-17
        • 2016-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-07
        • 2017-03-09
        相关资源
        最近更新 更多