隐式类型转换规则

隐式类型转换规则(寻常算术转换)

C语言中,当二元运算符的两个操作数类型不同时,编译器会自动将它们转换为相同类型。核心原则是:值域小的向值域大的转换。但在某些情况下,两个操作数都需要转换。

转换规则总览

场景转换方向
浮点数 + 整数整数绝对转换为浮点数
两个都是浮点数long double > double > float
两个都是整数long long > long > int > short > char

编译器逐级判定规则(按顺序匹配)

  1. 如果其中一个是 long double:把另外一个转换为 long double。
  2. 否则,如果其中一个是 double:把另外一个转换为 double。
  3. 否则,如果其中一个是 float:把另外一个转换为 float。
  4. 否则(两个都是整数):
    • 如果两个操作数都是带符号或都是无符号整数,把级别较低的操作数转换为级别较高的操作数的类型。
    • 无符号整数类型的级别从低到高与对应带符号类型相同:
      signed char / unsigned char → short / unsigned short → int / unsigned int → long / unsigned long → long long / unsigned long long
    • 所以 unsigned int 的级别与 int 相同。
  5. 否则,如果带符号整数类型的级别低于无符号整数类型的级别:把带符号整数转换为无符号整数类型。
  6. 否则,如果带符号整数类型的值域包含了无符号整数类型所表示的所有值:把无符号整数类型转换为带符号整数类型。
  7. 否则:两个操作数都转换为带符号整数类型对应的无符号整数类型。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注