2

来自 k&R C

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

这意味着下面的表达式

char a,b,c;

c=a+b;

实际上被计算为

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

这条规则背后的理由是什么?

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

4

3 回答 3

4

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

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

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

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

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

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

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

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

于 2012-01-20T06:45:12.987 回答
2

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

于 2012-01-20T06:45:33.977 回答
0

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

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

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

于 2012-01-20T08:01:36.610 回答