unsigned long mynum = 7;
if(mynum > -1) // false
为什么会这样?是因为-1是一个int,当它被“提升”为unsigned long时,它得到unsigned long的最大值?
答案 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
。