【问题标题】:Why does 1 > -1 seem to be false?为什么 1 > -1 似乎是错误的?
【发布时间】:2014-09-17 01:03:49
【问题描述】:

我已经编写了以下代码,但问题是它没有显示所需的输出。

#include<stdio.h>
int main()
{
    unsigned x=1;
    signed char y=-1;
    if(x>y)
        printf("x>y\n");
    else
        printf("x<=y\n");

    return 0;
}

上面的程序应该输出 x>y,因为第一个条件应该为真,因为 1 大于 -1,但它给出了输出 x

【问题讨论】:

  • signed char 操作数y 被转换为unsigned,产生一个很大的正值。
  • 如果有符号的字符 y 被转换为无符号的,那么它应该是 y=1,然后是 x==y 但是当我使用条件 if(x>=y) 时,如果条件不成立。跨度>
  • 不,将-1 转换为unsigned 的结果是UINT_MAX,而不是1
  • 现在,明白了。是的,在转换无符号字符后,它是一个巨大的 10 位数字。这就是 if 条件变为假的原因。谢谢。
  • @LuisColorado (unsigned)-1 不是未定义的行为。从有符号到无符号的转换和赋值是明确定义的。

标签: c char int


【解决方案1】:

由于从signed char 到unsigned int 的类型转换,程序给出了错误的输出。 尽量避免 char 到 int 隐式类型转换。

【讨论】:

    【解决方案2】:

    unsigned x=1; == unsigned int x=1;.

    x = 0x00000001;y = 0xff

    xy比较时,会出现type conversion,因为两者的类型不同。

    y 将首先转换为int,值为0xffffffff,但两者的类型仍然不同,因此y 的类型将转换为unsigned int,值为0xffffffff

    现在,比较两个unsigned int,其值为:x = 0x00000001y = 0xffffffff。现在,你应该明白原因了。

    【讨论】:

    • -1 不能转换为无符号,但编译器允许,产生未定义的行为...这是错误的常见原因。最好考虑将负数转换为无符号作为未定义行为的后果,而不是无端假设 -1 仅与 0xffffffff 进行比较(64 位整数或短整数会发生什么?)在非二进制补码算术架构中会发生什么?
    • y = 0xFF 不是写东西的好方法。 y-1 。内存中的表示可能是全位设置的,但是 (a) 这与问题无关,并且 (b) 当您编写 0xFF 时,您是在谈论内存中的表示还是 C整数字面量。
    • @MattMcNabb 如果你想要一个全为无符号的,只需写~0,但不要使用- 带无符号整数的符号。 0xff 不是一个好值的原因是对体系结构中字长的依赖性。好的,有一些方法可以避免这种情况,而不必依赖于架构,但使用标志不是其中之一。
    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多