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

时间:2014-09-12 14:59:21

标签: c++ c 64-bit

当我为有符号和无符号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)

1 个答案:

答案 0 :(得分:7)

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

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

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

但是,在第二个示例中,没有进行任何促销活动,因为int无法保留unsigned int的所有值,反之亦然。执行“原始”比较,比较相同的表示并返回true