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

为何可给unsigned int赋值负值?代码输出0而非10的原因

无符号整数赋值负数与计算结果异常的原因分析

你的实验代码如下:

#include <stdio.h>

int main(){
    unsigned int x,y,z;
    if(1){
        x=-5;
        y=5;
        z=x+y;
        printf("%i",z);
    }
    return 0;
}

1. 为什么能给unsigned int赋值负值?

在C语言中,将有符号负数赋值给无符号整数类型时,会触发标准定义的隐式转换规则:负数会被转换为该无符号类型可表示的最大值加1的模。
以32位unsigned int为例,其取值范围是0 ~ 4294967295(即0 ~ 2^32-1),赋值x=-5时,实际计算为2^32 + (-5),结果是4294967291,这个值会被正常存储到x中。编译器不会报错,这是完全符合C标准的行为。

2. 为什么计算结果是0而非10?

你错误地将unsigned int变量当成有符号整数来计算,忽略了无符号类型的溢出特性:

  • 转换后的x是无符号值4294967291,加上y的5后,总和为4294967296(即2^32)
  • 由于unsigned int的取值上限是2^32-1,当数值溢出时会自动对2^32取模,4294967296 % 2^32 = 0,因此z的值为0
  • 最后用printf("%i", z)输出时,%i用于打印有符号整数,但0的有符号与无符号表示完全一致,所以最终打印结果为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:50:39