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

时间:2012-01-20 06:41:45

标签: c integer-promotion

来自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很短,是否会发生这些转换?

3 个答案:

答案 0 :(得分:3)

不,这不是真的。 C99第5.1.2.3 Program execution节,第10条涵盖完全您询问的案例:

  

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

     

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

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

但是如果你想要在标准中作出具体决定背后的理由,你必须看看,......等待它,......是的,Rationale document: - )< / p>

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

  

添加了显式许可证,以“更广泛”的方式执行计算,而不是绝对必要的,因为这有时会产生更小更快的代码,更不用说更经常的正确答案。

     

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

  

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

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

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