unsigned short和签名的短期比较奇怪的行为

当我为signed和unsigned short指定相同的值并进行比较时,它会失败,但它适用于int 。 除非我使用其中一个或另一个使它们成为相同的类型,否则比较不起作用。

 #include int main() { signed short b = -10; unsigned short c=-10; signed int a = -10; unsigned int d=-10; printf("%d , %d\n",b,(unsigned short)b); printf("%d , %d\n",(signed short)c,c); printf("%d , %u\n",a,(unsigned int)a); printf("%d , %u\n",(signed int )d,d); printf("b==c %d\n", b==c); printf("a==d %d\n", a==d); return 0; } 

输出:

 ./a.out -10 , 65526 -10 , 65526 -10 , 4294967286 -10 , 4294967286 b==c 0 a==d 1 

我在sun solaris sparc和hpux itanium中以相同的输出运行它。 (64位exes)

这是因为C的整数提升规则。

以下是正在发生的事情:当您尝试比较两个不同类型的变量时,编译器会检查每个类型是否可以提升为int 。 当所有可能的值都适合int时,可以将类型提升为int 。 如果类型可以提升为int ,则将其提升为int ; 否则,编译器会检查它是否可以将类型提升为unsigned int 。 如果可以进行此促销,则在继续进行比较之前将值提升为unsigned int

在第一个示例中, signed shortunsigned short都可以提升为int 。 完成此操作后,您将获得不同的值,因此比较返回false

但是,在第二个示例中,没有进行任何提升,因为int不能保存unsigned int所有值,反之亦然。 执行“原始”比较,比较相同的表示并返回true