为何unsigned long long类型的两个数值比较结果相等?
为什么两个
unsigned long long数值的比较结果相等? 你的困惑完全可以理解——问题出在对~0的类型认知和C++有符号/无符号类型转换规则的误解上,咱们一步步理清楚:
1. 先搞懂~0到底是什么
首先,默认情况下0是有符号int类型的常量。对int类型的0按位取反~0,得到的是int类型的全1二进制值:
- 假设你的系统是32位int,这个值是
0xFFFFFFFF,但因为int是有符号的,这个二进制按照补码规则表示的是**-1**,而不是你以为的unsigned int最大值。这是第一个关键误区!
2. 把~0赋值给unsigned long long发生了什么
当你把有符号int类型的-1赋值给unsigned long long变量时,C++会执行有符号到无符号的转换,规则是:
转换结果等于该有符号值对
2^N取模,其中N是目标无符号类型的位数(64位对应2^64)
对于-1来说,-1 + 2^64 = 2^64 -1,也就是unsigned long long的最大值(64位全1)。
3. number2的计算逻辑
再看number2的代码:
unsigned long long number2 = unsigned long long(0); number2 = number2 - 1;
- 先把
0强制转成unsigned long long,值为0。 - 无符号类型的减法遵循溢出环绕规则:0减1会触发溢出,直接绕回该类型的最大值
2^64 -1。
结论
所以number1和number2最终都被赋值成了unsigned long long的最大值,自然相等。
如果你的初衷是让number1等于unsigned int的最大值(32位全1),需要显式把0指定为unsigned int类型:
unsigned long long number1 = ~0U; // 0U是unsigned int,取反后是unsigned int最大值,转成unsigned long long后高位补0
这样number1就是0xFFFFFFFF,而number2是0xFFFFFFFFFFFFFFFF,两者就不相等了。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

