我知道,每当运算符用于具有不同类型的两个操作数时,结果类型将是两个操作数之间的“主导”类型。
例如,结果
(int) + (float)
将是一个浮点数。
另一个例子是:
(char) + (double)
结果是双倍的。
这对于有符号变量是正确的,并且仅适用于有符号变量。
但是当我们将有符号变量与无符号变量结合起来时会发生什么?
详细信息在 C11, 6.3.1.8 中。总结一下:
如果无符号类型等于或宽,则将有符号类型转换为无符号。
否则,如果有符号类型可以保存无符号类型的所有值,则将无符号类型转换为有符号类型。
否则,两者都转换为对应于有符号类型的无符号版本。
“更广泛”是指“具有更高的转化排名”。
示例(在某些特定架构上,例如sizeof(short) == 2
and sizeof(long) == sizeof(unsigned int) = 4
):
int + unsigned int => unsigned int (first rule, equal rank)
long + unsigned short => long (second rule, long contains u. short)
long + unsigned int => unsigned long (third rule)