unsigned int 和signed char 比较

2023-12-12

我试图将 unsigned int 与signed char 进行比较,如下所示:

int main(){
  unsigned int x = 9;
  signed char y = -1;
  x < y ? printf("s") : printf("g");
  return 0;
}

我原以为 o/p 是“g”。相反,它是“s”。这里进行了什么样的转换?


Section 6.3.1.8, 通常的算术转换,C99 详细介绍了隐式整数转换。

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

这不算数,因为它们是不同的类型。

否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换等级的类型的操作数将转换为具有较大等级的操作数的类型。

这不算数,因为一个已签名,另一个未签名。

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

Bingo. x等级高于y所以 y 被提升为unsigned int。这意味着它变形自-1 into UINT_MAX,远大于 9。

其余规则不适用,因为我们已经找到了匹配项,但为了完整性,我将包括它们:

否则,如果有符号整型操作数的类型可以表示无符号整型操作数的所有值,则将无符号整型操作数转换为有符号整型操作数的类型。

否则,两个操作数都转换为与有符号整数类型操作数的类型相对应的无符号整数类型。


与此问题相关的排名如下所示。 C99 部分详细介绍了所有等级6.3.1.1, 布尔值、字符和整数所以你可以参考它以获取更多详细信息。

军衔为long long int应大于long int, 哪个 应大于int,这应大于short int,这应大于signed char.

军衔为char应等于signed char and unsigned char.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unsigned int 和signed char 比较 的相关文章

随机推荐