gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:57:11 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com