比较C中不同数据类型的一般规则是什么?

Gen*_*ene 8 c comparison types

可以说我有以下场景:

int i = 10;
short s = 5;

if (s == i){
   do stuff...
} else if (s < i) {
  do stuff...
}
Run Code Online (Sandbox Code Playgroud)

当C进行比较时,它会转换较小的数据类型,在这种情况下,short是int还是将右边的数据类型转换为左边的数据类型?在这种情况下int为short?

Oli*_*rth 12

这由通常的算术转换控制.对于简单的情况,一般的经验法则是将具有"较小"精度的类型转换为匹配具有"更多"精度的类型,但是一旦开始混合signed,它就会变得有些复杂unsigned.

在C99中,这由6.3.1.8节描述,为方便起见,我在此处包含:

  • 首先,如果任一操作数的相应实数类型是long double,则另一个操作数在不改变类型域的情况下被转换为其对应的实数类型的类型 long double.

  • 否则,如果任一操作数的相应实数类型是double,则另一个操作数在不改变类型域的情况下被转换为其对应的实数类型的类型 double.

  • 否则,如果任一操作数的相应实数类型是float,则另一个操作数在不改变类型域的情况下被转换为其对应的实数类型的类型 float.

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

    • 如果两个操作数具有相同的类型,则不需要进一步转换.
    • 否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型.
    • 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型.
    • 否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型.
    • 否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型.

我已经突出显示了适用于您的特定示例的部分.

整数转换等级的概念在6.3.1.1节中定义,它基本上描述了您可能期望的内容(具有较低精度的类型具有比具有更高精度的类型更低的类别).


emb*_*oss 5

来自类型转换:

第44页的隐式转换集虽然是非正式的,但正是现在要记住的.如果你注意到它们很容易记住,正如作者所说的,the `lower' type is promoted to the `higher' type,'' where the那些类型的顺序是

char < short int < int < long int < float < double < long double
Run Code Online (Sandbox Code Playgroud)

这个规则很容易记住 - "从低到高" - 但对于有符号和无符号整数类型它没有多大帮助,这些在Oli的帖子中得到了很好的解释.但在大多数情况下,它很容易记住并帮助您.