4

我正在尝试将 unsigned int 与有符号的 char 进行比较,如下所示:

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

我期待o / p是“g”。相反,它的“s”。这里做了什么样的转换?

4

4 回答 4

23

6.3.1.8C99的常用算术转换部分详细介绍了隐式整数转换。

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

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

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

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

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

答对了。x等级比 y 更高,y因此 y 被提升为unsigned int。这意味着它从-1变为UINT_MAX,大大大于 9。

其余规则不适用,因为我们找到了匹配项,但为了完整起见,我将它们包括在内:

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

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


与此问题相关的排名如下所示。所有等级都在 C99、section 6.3.1.1Boolean、character 和 integers中详细说明,因此您可以参考这些以获得更多详细信息。

的等级long long int应大于 的等级long int应大于 的等级int应大于 的等级short int应大于 的等级signed char

的秩char应等于 和 的signed charunsigned char

于 2011-02-23T07:22:10.257 回答
2

运行以下代码:

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

输出是:

4294967295
s

在一次强制转换之后,y 的值非常大。这就是为什么输出是 s。

于 2011-02-23T07:28:08.887 回答
2

我的猜测y被提升为unsigned int一个很大的价值(由于包装)。因此条件满足。

于 2011-02-23T07:16:31.680 回答
1

char 提升为 unsigned int,值为 MAX_UINT,大于 9。

于 2011-02-23T07:17:02.007 回答