假设我们有一个使用以下类型变量的赋值:
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 标准规则。