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

C++中为何`-1 + unsigned(0)`的结果大于0?

为什么这段C++代码中i > 0的结果为真?

先看这段代码:

#include <stdio.h>

int main() {
  auto i = -1 + unsigned(0);
  printf("%d %d\n", i, i > 0);
}

它的输出是-1 1,看似矛盾的原因在于类型转换规则和无符号数的特性:

  1. i的实际类型和值
    表达式-1 + unsigned(0)中,-1是有符号int,unsigned(0)是无符号unsigned int。根据C++的运算规则,当有符号数与无符号数混合运算时,有符号数会被转换为无符号数。
    有符号的-1转换为unsigned int时,会按照无符号数的模运算规则处理(以32位系统为例):-1加上2^32得到0xFFFFFFFF,所以i的实际类型是unsigned int,值为0xFFFFFFFF。

  2. printf的格式化输出误导
    第一个输出用%d(有符号int格式)打印i,0xFFFFFFFF作为有符号int的补码正好对应-1,所以输出-1,但这只是格式化显示的结果,i本身的类型和值并没有改变。

  3. i > 0的判定逻辑
    因为i是unsigned int类型,无符号数的取值范围是0到2^32-1(32位系统),所有无符号数都大于等于0,0xFFFFFFFF显然大于0,所以判定结果为1(真)。

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:09:54