...整数提升对两个操作数执行。 然后,以下规则将应用于升级的操作数:
- 如果两个操作数具有相同的类型,则无需进一步转换。 否则,如果两个操作数都具有有符号整数类型
- 或都具有无符号整数类型,则整数转换秩较小的操作数将转换为秩较大的操作数的类型。 否则,如果具有无符号整数类型的操作数
- 的秩大于或等于其他操作数类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。 否则,如果具有有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数
- 将转换为具有有符号整数类型的操作数的类型。
- 否则,两个操作数都将转换为与具有有符号整数类型的操作数的类型相对应的无符号整数类型
有人可以从上面解释一下最后一点和倒数第二点之间的区别吗?为什么需要最后一个?前 4 种情况不是涵盖了所有情况吗?如果有人能举个例子就完美了。谢谢
,两个操作数都将转换为无符号整数类型 对应于具有有符号整数类型的操作数的类型
让我们考虑一个sizeof( long )
等于sizeof( unsigned int )
的系统(例如,两者都等于4
)。
在这种情况下,尽管类型long
的秩大于 pf 类型的秩,但unsigned int
但有符号类型的操作数long
无法表示类型unsigned int
的所有值。
在这种情况下,二进制操作中使用的两个操作数都将转换为类型unsigned long
。
或者另一个例子,在某些系统中,sizeof( long long )
等于sizeof( unsigned long )
而等于8
。在这种情况下,这些类型的两个操作数将再次转换为类型unsigned long long
,因为long long
的秩大于类型unsigned long
的秩,但并非所有类型unsigned long
的操作数值都可以由有符号类型的对象表示long long
。
也就是说,此引用描述了有符号整数类型的操作数的秩大于无符号整数类型的秩但有符号整数类型的操作数无法表示无符号整数类型的操作数的所有值的情况。
前面的引文
否则,如果具有有符号整数类型的操作数的类型可以 表示带有无符号的操作数类型的所有值 整数类型,则转换具有无符号整数类型的操作数 具有有符号整数类型的操作数的类型。
描述有符号整数类型的秩大于无符号整数类型的秩的情况,有符号整数类型的操作数可以表示无符号整数类型的操作数的所有值。例如,当long
类型的一个操作数和unsigned int
和sizeof( long )
类型的另一个操作数等于8
并且sizeof( unsigned int )
等于 tp4
时。
当一个类型有符号类型而一个有无符号类型时,我们到达 (4),并且有符号类型具有更大的等级。
例如,这可以是long
和unsigned int
。
区分是使用 (4) 还是 (5) 的是有符号类型是否可以表示无符号类型的所有值。
-
在具有 32 位
long
和 16 位unsigned int
的系统上,我们将用例 4我们会使用
long
. -
在具有 32 位
long
和 32 位unsigned int
的系统上,我们将使用案例 5,因为 4,294,967,295 可以由此unsigned int
表示,但不能由此long
表示。我们会使用
unsigned long
.