unsigned int和signed char比较

bad*_*ash 4 c type-conversion char unsigned-integer

我试图将unsigned int与这样的signed char进行比较:

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

我期待o/p为"g".相反,它的"s".这里进行了什么样的转换?

pax*_*blo 23

C99的部分6.3.1.8,通常的算术转换,详细说明了隐式整数转换.

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

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

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

这不计算,因为一个签名,另一个签名.

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

答对了.x排名高于yy被提升为unsigned int.这意味着它变成-1UINT_MAX大大超过9的变形.

其他规则不适用,因为我们找到了匹配但我会将它们包括在内以保证完整性:

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

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


与此问题相关的排名如下所示.所有等级都在C99,section 6.3.1.1,Boolean,character和integer中详细说明,因此您可以参考它们以获取更多详细信息.

等级long long int应大于等级long int,等级int应大于等级short int,等级应大于等级signed char.

军衔char应等于的秩signed charunsigned char.

  • 实际上,我几乎_never_使用无符号整数.如果`int`不能保持足够大的值,如果需要,我会切换到`long`甚至`long long`.很多次,我被无条件的整数所咬,拒绝消极,使我的许多循环无限,导致焦虑和咬牙切齿:-) (4认同)
  • @paxdiablo,我只是做反向,从不尝试使用有符号整数类型.正确的寻址类型,大小和类似的东西是`size_t`,它是无符号的.大多数情况下,这种类型从整数类型中精确捕获了我想要的语义.对于人们用它来做什么,`int`几乎总是错误的类型.对我来说有意义的签名类型是`ptrdiff_t`,但就是这样. (3认同)
  • 在没有费心去查找的情况下,我认为在算术转换之前会应用整数提升.所以你说的一切都是正确的,但请注意,就算术转换而言,RHS操作数在它们看到它时就输入了"int". (2认同)