C中的隐式整数类型转换

owa*_*der 4 c implicit-conversion

我理解C语言在整数和浮点类型之间的隐式转换,但我对签名/无符号隐式类型转换有疑问.

例如,如果添加a unsigned char 和a signed int,结果类型是什么?它会是a unsigned int,a signed int还是别的什么?

我没有看到C99 ANSI标准中有任何具体内容,所以任何帮助都表示赞赏.

Bri*_*ian 7

在C99中,参考是6.3.1.8"常用算术转换".

许多期望算术类型操作数的运算符会以类似的方式导致转换并产生结果类型.目的是确定操作数和结果的通用实数类型.对于指定的操作数,每个操作数在不更改类型域的情况下转换为其对应的实类型是公共实类型的类型.除非另有明确说明,否则公共实类型也是结果的对应实数类型,如果它们相同则其类型域是操作数的类型域,否则是复数.这种模式称为通常的算术转换:

  • 首先,如果任一操作数的相应实数类型是long double,则另一个操作数在不改变类型域的情况下被转换为其对应的实数类型的类型long double.
  • 否则,如果任一操作数的相应实数类型是double,则另一个操作数在不改变类型域的情况下被转换为其对应的实数类型的类型double.
  • 否则,如果任一操作数的相应实数类型是float,则另一个操作数在不改变类型域的情况下被转换为其对应的实数类型的类型float.51)
  • 否则,将对两个操作数执行整数提升.然后将以下规则应用于提升的操作数:
    • 如果两个操作数具有相同的类型,则不需要进一步转换.
    • 否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型.
    • 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型.
    • 否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型.
    • 否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型.

此外执行通常的算术转换,因此,添加时unsigned charsigned int,或者:

  • 首先unsigned char是提升为int,然后两种类型都是相同的,所以结果有类型int,或
  • (不常见)int不能代表所有可能的unsigned char值.在这种情况下,unsigned char被提升为unsigned int,并且第三个子项适用:unsigned int具有相等的等级int,因此int操作数被转换为unsigned int,并且结果具有类型unsigned int.