当我将相同的值分配给有符号和无符号的 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 位执行)
最佳答案
这是因为 C 的整数提升规则。
事情是这样的:当您尝试比较两个不同类型的变量时,编译器会检查每种类型是否可以提升为 int
。当一个类型的所有可能值都适合一个 int
时,它可以被提升为 int
。如果一个类型可以被提升为一个int
,它就被提升为一个int
;否则,编译器会检查它是否可以将该类型提升为 unsigned int
。如果可以进行此提升,则在继续比较之前将该值提升为 unsigned int
。
在您的第一个示例中,signed short
和 unsigned short
都可以提升为 int
。完成此操作后,您将获得不同的值,因此比较返回 false
。
然而,在您的第二个示例中,没有进行任何提升,因为 int
不能保存 unsigned int
的所有值,反之亦然。执行“原始”比较,比较相同的表示并返回 true
。
关于c++ - unsigned short 和 signed short 比较奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29435164/