我写了一小段代码来测试一些东西:
#include int main() { unsigned x = 1; signed char y = -1 ; if (x>y) printf("X > Y"); else printf("X <= Y"); return 0; }
我得到的输出是“X -1?
我们有:
unsigned x = 1; signed char y = -1;
这个表达式:
x > y
用作if语句的控制表达式。
在通常的算术转换之后,右操作数y
将转换为unsigned int
值。 转换负的signed char
值-1
将是一个巨大的unsigned int
值(等于UINT_MAX
)。
所以表达式x > y
将被评估为:
1U > UINT_MAX
这总是假的(即评估为0)。
这是简短版本。 为了解释我们如何使用C标准规则得出这个结果,我将在下面解释它。
这是怎么回事:
使用>
关系运算符,这里是C对关系运算符的说法:
关系运算符 (C99,6.5.8p3)“如果两个操作数都具有算术类型,则执行通常的算术转换。”
好的,在我们的示例中,两个操作数都是整数类型,整数类型是算术类型。 所以通常会进行算术转换。 通常的算术转换是什么?
通常的算术转换 (C99,6.3.1.8p1)“否则,对两个操作数执行整数提升。然后将以下规则应用于提升的操作数:
好的,首先对每个操作数进行整数提升。 整数促销如何执行?
整数提升 (C99,6.3.1.1p2)“如果int可以表示原始类型的所有值,则该值将转换为int;否则,它将转换为unsigned int。这些称为整数提升。”
y
是带signed char
类型,因此在整数提升后它首先被提升为int
,而x
是unsigned int
类型并保持unsigned int
。
然后通常的算术转换将在两个操作数之间找到共同的类型。 在我们的例子中,它意味着:
通常的算术转换(套件) (C99,6.3.1.8p1)“否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型。”
unsigned int
与int
类型具有相同的转换排名(记住signed char
被提升为int
),因此提升的y
将从int
(在提升之后)转换为unsigned int
。 有关信息,整数转换等级在(C99,6.3.1.1p1)中定义。 正如您所注意到的, unsigned int
在通常的算术转换中胜过int
,另一种说法是说unsigned
是粘性的 。
现在,如果将int
值-1
(将其提升为int
后的signed char
-1
)转换为unsigned int
值,该怎么样?`。 以下是C在这种特定情况下对整数转换的说法:
整数转换 (C99,6.3.1.3p2)“否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在该范围内新类型。“
编写本段时其含义与签名数字表示无关。 对于二进制补码表示,它表示将int
值-1
转换为(UINT_MAX + 1) - 1
,它等于UINT_MAX
。 所以在我们的具体案例中,
x > y
相当于
1U > UINT_MAX
相当于
0
如果比较不同类型的变量,则在完成比较之前,必须将其中一个变量强制转换为另一个变量。
“较短”类型将被提升为“更长”类型。
在这种情况下, signed char y
将被转换为值为UINT_MAX
的unsigned int
。
具体来说,假设编译器使用32位ints
:
signed char -1 = 0xff becomes -> signed int -1 = 0xffffffff becomes -> unsigned int 0xffffffff = UINT_MAX
因此x < y
。
不是1> -1?
除非您使用unsigned
值,否则它是。 在unsigned
的世界中,最小值为零和一。 其他一切都更大,语言明确指出unsigned(-1)
是最大的无符号值。
以上就是c/c++开发分享为什么比较signed char和unsigned int不能正常工作?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549695.html