编译器独立表达式算术转换和整数提升

时间:2013-08-13 22:10:55

标签: c casting type-conversion integer-promotion

假设我们使用以下类型的变量进行分配:

uint64 = uint16 + uint16 + uint32 + uint64

假设我们知道只要使用uint64完成所有工作,得到的r值就会适合uint64。

在遵循标准C规则进行任何计算之前,编译器是否会隐式地将两个uint16和uint32提升为uint64?

即。

1。)uint64 = uint16 + uint16 + uint32 + uint64

2。)uint64 = uint64 + uint64 + uint64 + uint64

特别是通过在以下代码段中应用第二个语句:

  

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

     

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

     

否则,如果具有无符号整数类型的操作数具有等级   那么,大于或等于另一个操作数的类型的等级   带有符号整数类型的操作数转换为   具有无符号整数类型的操作数。

     

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

     

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

或者该规则仅应用于算术表达式的直接lhs和rhs,以便可以首先计算添加两个uint16,其中在结果已知之前不会提升类型,然后将其提升为uint32,然后这个结果提升到了uint64等......

即。

1。)uint64 = uint16 + uint16 + uint32 + uint64

2。)uint64 = (((uint16 + uint16) + uint32) + uint64)

3。)uint64 = ((uint32 + uint32) + uint64)

4。)uint64 = (uint64 + uint64)

请指出任何C标准规则,这可能会为我解决这个问题。

1 个答案:

答案 0 :(得分:3)

该规则适用于中间结果:

uint16 + uint16 + uint32 + uint64

相当于

((uint16 + uint16) + uint32) + uint64

并且通常的算术转换在+运算符的两侧执行。

  

(C99,6.5.6加法运算符p4)“如果两个操作数都有算术类型,则对它们执行通常的算术转换。”

请注意,假设32-bit int,这实际上与:

相同
(uint64) ((unsigned int) ((int) uint16 + (int) uint16) + uint32) + uint64

uint16被提升为int而不是unsigned int,然后由于unsigned int,结果转换为uint32