假设我们有一个使用以下类型变量的赋值:
uint64 = uint16 + uint16 + uint32 + uint64
假设我们知道只要所有的工作都是使用uint64完成的,那么得到的r值就适合uint64。
编译器是否会在执行任何遵循标准C规则的计算之前,隐式地将两个uint16和uint32提升到uint64?

1.)uint64 = uint16 + uint16 + uint32 + uint64
2.)uint64 = uint64 + uint64 + uint64 + uint64
特别是通过应用以下代码段中的第二条语句:
如果两个操作数具有相同的类型,则不再进行转换
需要。
否则,如果两个操作数都具有有符号整数类型,或两者都具有
无符号整数类型,具有较小整数类型的操作数
转换秩转换为具有更大值的操作数类型
等级。
否则,如果具有无符号整数类型的操作数具有秩
大于或等于其他操作数类型的秩,则
带符号整数类型的操作数转换为
无符号整数类型的操作数。
否则,如果带符号整数类型的操作数的类型可以
用无符号表示操作数类型的所有值
整数类型,则转换无符号整数类型的操作数
带符号整数类型的操作数的类型。
否则,两个操作数都转换为无符号整数类型
与带符号整数类型的操作数类型相对应。
或者,该规则是否仅适用于算术表达式的直接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标准的规则,也可以为我澄清这一点。

最佳答案

此规则适用于中间结果:

uint16 + uint16 + uint32 + uint64

相当于
((uint16 + uint16) + uint32) + uint64

通常的算术转换是在+运算符的两边执行的。
(C99,6.5.6加法运算符p4)“如果两个操作数都具有算术类型,则对它们执行通常的算术转换。”
注意,假设32-bitint,这实际上与:
(uint64) ((unsigned int) ((int) uint16 + (int) uint16) + uint32) + uint64

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

关于c - 编译器独立的表达式算术转换和整数提升,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18220090/

10-11 00:38