我想知道输出以下代码的原因是什么:

unsigned short a=10,aa=-1;
if(a>-1)
  printf("surprise");
else
  printf(" No surprise");

这给输出“惊喜”
 unsigned int a=10,aa=-1;
    if(a>-1)
      printf("surprise");
    else
      printf("No surprise");

这给输出“没有惊喜”

unsigned short a=10,aa=-1;
if(a>aa)
   printf("surprise");
else
  printf("No surprise");

这给输出“一点也不奇怪”

最佳答案

查看此堆栈交换问题:
In a C expression where unsigned int and signed int are present, which type will be promoted to what type?
在编程人员的响应中,列出了完整的规则。
在第一种情况下,应用第四个规则(-1是有符号整数,它可以表示无符号short的所有值,因此无符号short被提升为有符号整数)。
在第二种情况下,应用第三个规则(有符号整数不能表示无符号整数的所有值,因此它被更改为无符号整数)。
在第三种情况下,-1转换为unsigned short,然后应用第一个规则。
一般来说,在进行任何比较之前,我喜欢通过将所有变量转换为相同的有符号类型(足够大以容纳我期望的范围)来避免混淆。

10-08 18:15