1

假设我们有一个使用以下类型变量的赋值:

uint64 = uint16 + uint16 + uint32 + uint64

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

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

IE

1.)uint64 = uint16 + uint16 + uint32 + uint64

2.)uint64 = uint64 + uint64 + uint64 + uint64

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

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

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

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

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

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

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

IE

1.)uint64 = uint16 + uint16 + uint32 + uint64

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

3.)uint64 = ((uint32 + uint32) + uint64)

4.)uint64 = (uint64 + uint64)

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

4

1 回答 1

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提升为intnot to unsigned int,然后将结果转换为unsigned intbecause of uint32

于 2013-08-13T22:15:07.750 回答