当我为有符号和无符号short
分配相同的值并进行比较时,它会失败,但它适用于int
。除非我将一个或另一个用于使它们成为相同的类型,否则比较不起作用。
#include<stdio.h>
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)
答案 0 :(得分:7)
这是因为C的整数提升规则。
以下是正在发生的事情:当您尝试比较两个不同类型的变量时,编译器会检查每种类型是否可以升级为int
。当所有可能的值都适合int
时,可以将类型提升为int
。如果某个类型可以升级为int
,则会将其提升为int
;否则,编译器会检查它是否可以将类型提升为unsigned int
。如果可以进行此促销,则会在继续比较之前将该值提升为unsigned int
。
在您的第一个示例中,signed short
和unsigned short
都可以升级为int
。完成此操作后,您将获得不同的值,因此比较将返回false
。
但是,在第二个示例中,没有进行任何促销活动,因为int
无法保留unsigned int
的所有值,反之亦然。执行“原始”比较,比较相同的表示并返回true
。