来自 k&R C
- 首先,如果任一操作数为 long double,则将另一个操作数转换为 long double。
- 否则,如果任一操作数为双精度,则另一个将转换为双精度。
- 否则,如果任一操作数为浮点数,则另一个将转换为浮点数。
- 否则,对两个操作数执行积分提升;...
这意味着下面的表达式
char a,b,c;
c=a+b;
实际上被计算为
c = char((int)a+(int)b);
这条规则背后的理由是什么?
如果 a、b 和 c 都很短,这些转换会发生吗?
来自 k&R C
- 首先,如果任一操作数为 long double,则将另一个操作数转换为 long double。
- 否则,如果任一操作数为双精度,则另一个将转换为双精度。
- 否则,如果任一操作数为浮点数,则另一个将转换为浮点数。
- 否则,对两个操作数执行积分提升;...
这意味着下面的表达式
char a,b,c;
c=a+b;
实际上被计算为
c = char((int)a+(int)b);
这条规则背后的理由是什么?
如果 a、b 和 c 都很短,这些转换会发生吗?
不,这实际上不是真的。C99 部分,第 10 条完全5.1.2.3 Program execution涵盖了您询问的情况:
示例 2
在执行片段
char c1, c2;
c1 = c1 + c2;
时,“整数提升”要求抽象机将每个变量的值提升为 int 大小,然后将两个 int 相加并截断总和。如果添加两个字符可以在没有溢出的情况下完成,或者溢出包装静默产生正确的结果,实际执行只需要产生相同的结果,可能会省略促销。
因此,如果已知该操作会产生相同的结果,则不需要使用更宽的值。
但是,如果您想了解标准中特定决定背后的基本原理,您必须查看,..... 等待它,..... 是的,基本原理文档:-)
在该理由的第 6.3.1.8 节(部分与标准中的部分匹配)中,它指出:
添加了显式许可证以执行比绝对必要的“更宽”类型的计算,因为这有时可以生成更小更快的代码,更不用说更频繁地正确答案了。
只要获得相同的最终结果,也可以通过 as if 规则以“更窄”的类型执行计算。
一些指令集架构没有任何算术机指令来对少于一个字的整数(如short和char)进行操作。因此,要求该约定使编译器的事情变得更简单。大多数情况下,转换为单词并在单词大小的操作数上进行操作就足够了。
如果 a、b 和 c 都很短,这些转换会发生吗?
是的,整数提升适用于所有小整数类型:char、short 和 C99 bool。
int严格来说,除非编译器优化掉整数提升,否则C 程序不能对小于 a 的任何东西执行任何形式的算术运算。