C 常用算术转换规则



...整数提升对两个操作数执行。 然后,以下规则将应用于升级的操作数:

  1. 如果两个操作数具有相同的类型,则无需进一步转换。
  2. 否则,如果两个操作数都具有有符号整数类型
  3. 或都具有无符号整数类型,则整数转换秩较小的操作数将转换为秩较大的操作数的类型。
  4. 否则,如果具有无符号整数类型的操作数
  5. 的秩大于或等于其他操作数类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。
  6. 否则,如果具有有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数
  7. 将转换为具有有符号整数类型的操作数的类型。
  8. 否则,两个操作数都将转换为与具有有符号整数类型的操作数的类型相对应的无符号整数类型

有人可以从上面解释一下最后一点和倒数第二点之间的区别吗?为什么需要最后一个?前 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 intsizeof( long )类型的另一个操作数等于8并且sizeof( unsigned int )等于 tp4时。

当一个类型有符号类型而一个有无符号类型时,我们到达 (4),并且有符号类型具有更大的等级。

例如,这可以是longunsigned 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.

最新更新