C中的常用算术转换:这个特定规则背后的基本原理是什么

来自k&R C.

  • 首先,如果任一操作数是long double,则另一个操作数转换为long double。
  • 否则,如果任一操作数为double,则另一个操作数转换为double。
  • 否则,如果任一操作数是浮点数,则另一个操作数转换为浮点数。
  • 否则,对两个操作数执行整体促销 ; …

这意味着低于表达

char a,b,c; c=a+b; 

实际上是计算为

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

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

如果a,b和c很短,是否会发生这些转换?

不,这不是真的。 C99第5.1.2.3 Program execution5.1.2.3 Program execution ,第10条完全涵盖了您所询问的情况:

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

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

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

但是如果你想要在标准中作出具体决定背后的理由,你必须看看,……等待它,…..是的,基本原理文件 🙂

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

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

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

几个指令集体系结构没有任何算术机器指令来操作小于一个字的整数(如shortchar )。 因此,要求该约定使编译器更简单。 大多数时候,转换为单词并在字大小的操作数上操作就足够了。

如果a,b和c很短,是否会发生这些转换?

是的,对所有小整数类型进行整数提升:char,short和C99 bool。

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