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

时间:2011-07-09 18:52:58

标签: c comparison types

假设我有以下情况:

int i = 10;
short s = 5;

if (s == i){
   do stuff...
} else if (s < i) {
  do stuff...
}

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

4 个答案:

答案 0 :(得分:11)

这由通常的算术转换决定。对于简单的情况,一般的经验法则是将具有“较小”精度的类型转换为与具有“更多”精度的类型匹配,但是一旦开始混合signedunsigned,它就会变得有些复杂

在C99中,这由第6.3.1.8节描述,为方便起见,我在此处加入:

  
      
  • 首先,如果任一操作数的对应实数类型为long double,   另一个操作数被转换,   不改变类型域,到   类型对应的实际类型是   long double

  •   
  • 否则,如果任一操作数的对应实数类型为double,   另一个操作数被转换,   不改变类型域,到   类型对应的实际类型是   double

  •   
  • 否则,如果任一操作数的对应实数类型为float,   另一个操作数被转换,   不改变类型域,到   类型对应的实际类型是   float

  •   
  • 否则,将对两个操作数执行整数提升。然后   以下规则适用于   推广操作数:

         
        
    • 如果两个操作数具有相同的类型,则不再进行进一步的转换   需要的。
    •   
    • 否则,如果两个操作数都有有符号整数类型或两者都有   无符号整数类型,操作数   具有较小整数的类型   转换等级转换为   排名较高的操作数的类型。
    •   
    • 否则,如果具有无符号整数类型的操作数具有等级   大于或等于的等级   另一个操作数的类型,然后是   带符号整数类型的操作数是   转换为操作数的类型   无符号整数类型。
    •   
    • 否则,如果带有符号整数类型的操作数的类型可以   代表了所有的价值观   带有无符号的操作数的类型   整数类型,然后是操作数   无符号整数类型转换为   带有签名的操作数的类型   整数类型。
    •   
    • 否则,两个操作数都将转换为无符号整数类型   对应的类型   带有符号整数类型的操作数。
    •   
  •   

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

整数转换等级的概念在6.3.1.1节中定义,它基本上描述了您可能期望的内容(精度较低的类型的排名低于具有更高精度的类型)。< / p>

答案 1 :(得分:5)

来自Type Conversions

  

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

char < short int < int < long int < float < double < long double

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

答案 2 :(得分:2)

作为一般规则,如果它们不是同一类型,C将不会比较两个值,并且永远不会将变量隐式转换为精度较低的类型。在您的示例代码中,short被提升为int,这相当于写作:

int i = 10;
short s = 5;

if ((int)s == i){
   do stuff...
} else if ((int)s < i) {
  do stuff...
}

这将完全符合您的预期,但签名/无符号比较也是如此。

答案 3 :(得分:1)

数据类型是各种类型的抽象...就计算机而言,没有intshort。有记忆,有数据。

当你说int x时,你对计算机说“给我足够的字节来存储一个int”,当你说short y时,你说...你猜对了。

short,正如您所期望的那样占用的字节少于int,因此可能(通常会)包含相邻字节中的数据。在比较不同类型的数据时,问题是“相邻位会导致结果偏差吗?”

每当您比较两种不同的数据类型时,您确实在比较存储在两个不同位置的位。存储以表示数据的单个位的最大数量需要与用于比较的相同大小

Casting用于帮助解决此问题。