为什么比较unsigned long和negative number会导致false?

时间:2016-10-05 11:07:30

标签: c++ c++11

unsigned long mynum = 7;

if(mynum > -1) // false

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

3 个答案:

答案 0 :(得分:2)

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

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

由于无符号值不能低于0,它将返回无符号长度的最大值 - 在这种情况下为8或4294967288。
那就是当你的操作中-1转换为无符号长

时发生的事情

答案 1 :(得分:2)

无符号变量具有最大值,它们没有减号,因此最后一位为正。

为unsigned指定负值会将值设置为相应的有符号值: -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;
}

答案 2 :(得分:2)

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

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

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

此处-1不被视为-1,但其等同于unsigned long