如果不同的数据类型作为参数,运算符的结果? (C)

时间:2017-03-10 18:23:52

标签: c operators

我无法找到以下问题的答案。

我的问题是:

当操作不同的数据类型(如int或float)时,运算符的结果是什么?

例如,

float * int = ?

float / int = ?

我们知道对相同数据类型的操作会给出相同数据类型的结果。例如,

float * float = float

但我想知道在其他情况下会发生什么?

这个问题可能已经在这里讨论过了,但我很难找到类似的东西。

感谢。

2 个答案:

答案 0 :(得分:1)

如果对不同类型的值进行操作,操作数将经历通常的算术转换。。这些在C standard的第6.3.1.8节中指定。

  

首先,如果任一操作数的相应实数类型是long double   ,转换另一个操作数,不改变类型
  domain,对应的实类型为long double的类型   

     

否则,如果对应的实数类型为任一操作数   是两倍,另一个操作数被转换,没有变化
  类型的域,对应的实际类型的类型   双倍。

     

否则,如果对应的实数类型为任一操作数   是浮点数,另一个操作数被转换,没有变化
  类型的域,对应的实际类型的类型   漂浮。

     

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

     
      
  • 如果两个操作数具有相同的类型,则不再进一步转换   需要的。

  •   
  • 否则,如果两个操作数都有有符号整数类型或两者都有   无符号整数类型,类型较小的操作数   整数转换等级转换为操作数的类型   排名更高。

  •   
  • 否则,如果具有无符号整数类型的操作数具有   等级大于或等于另一个类型的等级   操作数,那么带有符号整数类型的操作数是   转换为带无符号整数的操作数类型   类型。

  •   
  • 否则,如果带有符号整数类型的操作数的类型可以   表示带有unsigned的操作数类型的所有值   整数类型,那么带无符号整数类型的操作数是   转换为带有符号整数类型的操作数类型。

  •   
  • 否则,两个操作数都将转换为无符号
      整数类型对应于带有signed的操作数的类型   整数类型。

  •   

如果floatint作为*/的操作数,则int操作数将转换为float }。

答案 1 :(得分:1)

在执行算术运算之前,编译器会安排执行"usual arithmetic conversions"

准确的规则有点复杂,并且在提供的链接中有详细记录,但基本思路是:

  1. 如果任一参数是浮点类型,则两个参数都将转换为两个参数之间更精确的浮点。

  2. 否则,如果两个参数都是整数类型,则它们首先被提升为至少int,然后如果两个参数的宽度不同,则较窄的参数将转换为另一个。

  3. 由于以下几个原因,真正的规则更加复杂:

    1. 现代C编译器可以实现complex(和imaginary)类型,这些类型会影响转换。

    2. 有符号和无符号类型之间的转换可能违反直觉。如果您还没有阅读确切的规则,最好避免这种情况。