【问题标题】:unsigned short and signed short comparison wierd behavior无符号短和有符号短比较奇怪的行为
【发布时间】:2014-09-12 14:59:21
【问题描述】:

当我将相同的值分配给有符号和无符号 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 位 exe)

【问题讨论】:

  • 你为什么要把苹果和橘子比较?
  • 这可能是重复的,但不是那个问题。虽然两者都与整数提升有关,但这一项涉及扩大转换。

标签: c++ c 64-bit


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢!这就解释了。完美!
  • 规则比这要复杂一些。平台将intlong 定义为35 个值位加一个符号位,并将unsigned intunsigned long 定义为35 个值位加一个填充位是合法的。在这样的平台上,intunsigned long 之间的操作会将两个操作数都转换为unsigned long尽管int 可以表示unsigned long 的所有值!),但是一个操作在longunsigned int 之间会将两个操作数都转换为long(即使unsigned int 的大小与unsigned long 相同)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 2011-06-18
  • 2013-02-16
相关资源
最近更新 更多