c++ - unsigned short 和 signed short 比较奇怪的行为

标签 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 位执行)

最佳答案

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

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

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

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

关于c++ - unsigned short 和 signed short 比较奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29435164/

相关文章:

c - 如何将字符串可移植地转换为不常见的整数类型?

c++ - boost::uint64_t 的字符串因 lexical_cast 和 stringsteam 而失败

cocoa - 保持传统 Carbon 代码的活力

c++ - 使用 lambda 的简单 RAII 包装器的复制初始化在 GCC 和 Clang 下意外失败

c++ - 从 Poco http 客户端获取对字符串的响应

c++ - 为什么我们需要模板 <int N> 因为我们有类初始化

c - C语言函数指针内存解释

c++ - 如果 SDL_BlitSurface 中的 src 和 dest 相同会发生什么?

c - 四舍五入到 2 的幂(使用预处理器常量)

c - 64位除以32位