c/c++语言开发共享为什么比较signed char和unsigned int不能正常工作?

我写了一小段代码来测试一些东西:

#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 ,而xunsigned int类型并保持unsigned int

    然后通常的算术转换将在两个操作数之间找到共同的类型。 在我们的例子中,它意味着:

    通常的算术转换(套件) (C99,6.3.1.8p1)“否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型。”

    unsigned intint类型具有相同的转换排名(记住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_MAXunsigned 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

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐