我无法找到以下问题的答案。
我的问题是:
当操作不同的数据类型(如int或float)时,运算符的结果是什么?
例如,
float * int = ?
float / int = ?
我们知道对相同数据类型的操作会给出相同数据类型的结果。例如,
float * float = float
但我想知道在其他情况下会发生什么?
这个问题可能已经在这里讨论过了,但我很难找到类似的东西。
感谢。
答案 0 :(得分:1)
如果对不同类型的值进行操作,操作数将经历通常的算术转换。。这些在C standard的第6.3.1.8节中指定。
首先,如果任一操作数的相应实数类型是long double ,转换另一个操作数,不改变类型
domain,对应的实类型为long double的类型否则,如果对应的实数类型为任一操作数 是两倍,另一个操作数被转换,没有变化
类型的域,对应的实际类型的类型 双倍。否则,如果对应的实数类型为任一操作数 是浮点数,另一个操作数被转换,没有变化
类型的域,对应的实际类型的类型 漂浮。否则,将对两者执行整数提升 操作数。然后将以下规则应用于升级 操作数:
如果两个操作数具有相同的类型,则不再进一步转换 需要的。
否则,如果两个操作数都有有符号整数类型或两者都有 无符号整数类型,类型较小的操作数 整数转换等级转换为操作数的类型 排名更高。
否则,如果具有无符号整数类型的操作数具有 等级大于或等于另一个类型的等级 操作数,那么带有符号整数类型的操作数是 转换为带无符号整数的操作数类型 类型。
否则,如果带有符号整数类型的操作数的类型可以 表示带有unsigned的操作数类型的所有值 整数类型,那么带无符号整数类型的操作数是 转换为带有符号整数类型的操作数类型。
否则,两个操作数都将转换为无符号
整数类型对应于带有signed的操作数的类型 整数类型。
如果float
和int
作为*
或/
的操作数,则int
操作数将转换为float
}。
答案 1 :(得分:1)
在执行算术运算之前,编译器会安排执行"usual arithmetic conversions"。
准确的规则有点复杂,并且在提供的链接中有详细记录,但基本思路是:
如果任一参数是浮点类型,则两个参数都将转换为两个参数之间更精确的浮点。
否则,如果两个参数都是整数类型,则它们首先被提升为至少int
,然后如果两个参数的宽度不同,则较窄的参数将转换为另一个。
由于以下几个原因,真正的规则更加复杂:
现代C编译器可以实现complex
(和imaginary
)类型,这些类型会影响转换。
有符号和无符号类型之间的转换可能违反直觉。如果您还没有阅读确切的规则,最好避免这种情况。