You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:27:34