【问题标题】:What is the difference between Integral Promotion and Balancing in C?C中的积分提升和平衡有什么区别?
【发布时间】:2012-08-19 03:11:49
【问题描述】:

积分提升和平衡有什么区别。我们是否可以总结这两条规则,即任何类型在执行任何操作之前都转换为至少 int 或 unsigned int 类型(逻辑运算符 &&、||、! 除外),如果任何操作数的类型更大,则转换为更大的类型比 int 吗?

【问题讨论】:

  • “Promotion”是C的一部分,“balancing”是你刚刚编出来的词?
  • 什么是平衡。一个类型怎么能比另一种类型更大呢?我知道类型之间没有排序关系。
  • @TomTanner:C 标准定义了整数转换等级。在 C 2011 中,它在 6.3.1.1 中。
  • @TomTanner:浮点数有什么关系?您写道,您不知道类型之间的排序关系。我通知了你一个订购关系。给定一个排序关系(偏序),一些类型“大于”其他一些类型。我怀疑,通过“平衡”,提问者指的是 C 的“常用算术转换”(6.3.1.8),它使用包括整数转换等级的类型排序将多个操作数转换为通用类型。
  • 平衡是一个非常常见的编程术语,用于代替正式术语“通常的算术转换”。读一本 C 书,人们...

标签: c c99 c89 misra


【解决方案1】:

标准中有两种不同的东西,但没有一种叫做平衡:

如果int 可以表示原始类型的所有值(受限制 通过宽度,对于位域),值被转换为int; 否则,它将转换为unsigned int。这些被称为 整数提升.58) 所有其他类型都被整数不变 促销活动。

....

6.3.1.8 通常的算术转换 许多期望算术类型的操作数的运算符会导致转换并产生结果类型 以类似的方式。目的是为 操作数和结果。

应用于不同类型表达式的运算符的一般思想是将操作数转换为精度损失较小的类型。例如,如果 afloat 并且 b 是双精度数,则在加法之前,总和 a + b a 将转换为 double。如果cunsigned long 则类似,它首先转换为doublec + b

【讨论】:

  • 能否提供第二段不涉及整体推广的例子。我认为这将是一个很大的帮助。
【解决方案2】:

“Integral Promotions”是旧的 C90 术语,正式的标准术语是integer Promotions

整数提升是适用于任何时候将小整数类型(bool、char、short 及其有符号等价物)用作表达式中的操作数的规则。

C11 6.3.1.1/4

如果一个 int 可以表示原始类型的所有值(受限制 通过宽度,对于一个位域),该值被转换为一个 int; 否则,它将转换为无符号整数。这些被称为 整数促销。所有其他类型都不变整数 促销活动。

“平衡”是一个非正式术语,指的是一组称为常用算术转换的规则。它们说明了操作中每个操作数的所有隐式类型提升是如何完成的。请注意,整数提升是通常算术转换的一部分:

C11 6.3.1.8

首先,如果任一操作数对应的实数类型为长 double,转换另一个操作数,不改变类型域, 对应的实数类型为 long double 的类型。

否则,如果任一操作数对应的实数类型为双精度, 另一个操作数在不改变类型域的情况下转换为 对应的实数类型为double的类型。

否则,如果任一操作数对应的实数类型是浮点数, 另一个操作数在不改变类型域的情况下转换为 对应实类型为 float 的类型。

否则,对两个操作数都执行整数提升。 然后 以下规则适用于提升的操作数:

如果两个操作数的类型相同,则不再进行转换 需要。

否则,如果两个操作数都具有有符号整数类型或两者都有 有无符号整数类型,具有较小类型的操作数 整数转换等级转换为操作数的类型 更大的排名。

否则,如果操作数为无符号整数类型 等级大于或等于其他类型的等级 操作数,然后将带符号整数类型的操作数转换为 无符号整数类型的操作数的类型。

否则,如果带符号整数类型的操作数的类型可以表示所有 具有无符号整数类型的操作数的类型的值,然后 无符号整数类型的操作数转换为 带符号整数类型的操作数。

否则,两个操作数都转换为无符号整数类型,对应有符号整数类型的操作数。

【讨论】:

  • 这也适用于 c90 或 c99 吗?
  • @bubble C90、C99、C11 和 C++(除了long double,我相信它是在 C99 中引入的)。另外,我刚刚了解到“积分促销”是旧的 C90 术语,在当前标准中称为整数促销。帖子已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2017-10-04
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多