2012-01-20 14 views
1

选自K & R C通常的算术转换在C:请告诉我该特定规则

  • 首先背后的基本原理,如果操作数是双长,另一个被转换为长一倍。
  • 否则,如果其中一个操作数是double,另一个则转换为double。
  • 否则,如果其中一个操作数是float,另一个则转换为float。
  • 否则,积分促销在两个操作数; ...

这意味着低于表达

char a,b,c; 

c=a+b; 

实际计算值作为

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

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

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

回答

3

不,这不是真的。 C99第5.1.2.3 Program execution,第10条涵盖正是您询问有关情况:

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

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

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

但是,如果你希望在标准做出具体决定背后的理由,你必须看,.....等待它,......是的,Rationale document :-)

在该原理的部分6.3.1.8(部分匹配在标准),它指出:加入

显式许可在“宽”型比绝对需要执行计算,因为这样有时会产生更小和更快的代码,更不用说更经常的正确答案。

只要获得相同的最终结果,计算也可以按照“规则”的规则在“较窄”类型中执行。

+0

所以只要实现确保'char((int)a +(int)b)'和'a + b'是否可以省略相同的促销活动? – Hari

+0

谢谢,这回答我的问题 – Hari

+0

应该指出,标准的引用部分涵盖程序流程和可能的优化。假设发生整数提升总是最好的,否则最终会出现错误。例如'(c1 + c2)/ c3',其中c1 + c2可能会溢出。编译器无法优化那里的升级,因为它会给出不同的结果。 – Lundin

2

一些指令集架构没有任何算术机器指令对低于一个字整数操作(如shortchar)。所以要求该约定使编译器更简单。大多数情况下,转换为字和操作字大小的操作数就足够了。

0

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

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

严格地说,一个C程序不能在不同于int更小的东西进行任何形式的算术的,除非编译器优化掉整数促销。