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 short
和unsigned short
都可以提升为int
。 完成此操作后,您将获得不同的值,因此比较返回false
。
但是,在第二个示例中,没有进行任何提升,因为int
不能保存unsigned int
所有值,反之亦然。 执行“原始”比较,比较相同的表示并返回true
。