【问题标题】:Why does comparing unsigned long with negative number result in false? [duplicate]为什么将 unsigned long 与负数进行比较会导致错误? [复制]
【发布时间】:2016-10-05 11:07:30
【问题描述】:
unsigned long mynum = 7;

if(mynum > -1) // false

为什么会这样?是不是因为-1是一个int,当它被“提升”为unsigned long时,它得到了unsigned long的最大值?

【问题讨论】:

  • Signed 在此比较中变为未签名,您是对的...
  • 这也意味着您的编译器警告级别不够高,因为应该标记。
  • @WhozCraig 我的编译器确实警告说,如果我执行“if (mynum>=0)”,它将永远是正确的......但否则它只会关闭...... Xcode 8,lldb ...
  • @John 尝试启用-Wsign-compare 或更简单的-Wextra

标签: c++ c++11


【解决方案1】:

这可能不对,但这是我的想法:
当你执行以下代码时

unsigned long a = -8;
std::cout << a;

由于无符号值不能低于 0,因此它将返回无符号长整数的最大值 - 在这种情况下为 8 或 4294967288。
这就是 -1 在您的操作中转换为无符号长整数时发生的情况

【讨论】:

    【解决方案2】:

    无符号变量具有最大值,它们没有负号,所以最后一位是正数。

    将负值分配给无符号数会将值设置为相应的有符号值: -1 和 255 具有相同的位域集:

    #include <iostream>
    
    int main()
    {
        unsigned char uc1 = 255; // 11111111
        unsigned char uc2 =  -1;
    
        //signed  : -1 : 11111111 : 1 1111111 : -128 + 127
        //unsigned: 255: 11111111 : 1 1111111 :  128 + 127
    
        if(uc1 == uc2)
            std::cout << "uc1 = uc2" << std::endl;
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      这是因为implicit typecast 是由编译器在内部执行的。

      当操作在两种不同类型的变量之间进行时,编译器本身会将较低的数据类型临时转换为较高的数据类型。

      在您的代码中,-1 暂时充当unsigned long,因为隐式类型转换由编译器本身执行。它表现为unsigned long,因为另一个变量是该类型的。

      这里的 -1 不被视为-1,而是被视为等同于unsigned long

      【讨论】:

        猜你喜欢
        • 2021-12-25
        • 2020-07-29
        • 1970-01-01
        • 2017-06-30
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 2018-07-12
        • 2021-07-23
        相关资源
        最近更新 更多