假设我们使用以下类型的变量进行分配:
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标准规则,这可能会为我解决这个问题。
答案 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
。