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

为什么用%d打印赋了-1的unsigned int和unsigned short int结果不同

C语言无符号短整型printf输出异常原因分析

你提供的测试代码如下:

#include<stdio.h>
int main(){
    unsigned int u=-1;
    unsigned short int y=-1;
    printf("%d %u\n",u,u);
    printf("%d %u",y,y);
}

这个现象的核心原因是C语言的整数默认提升规则和无符号类型赋值规则共同作用的结果,分两步拆解:

  • 第一步:赋值阶段的无符号类型转换
    C标准规定,将有符号整数赋值给无符号类型时,会自动按补码规则转换为对应无符号值:
    • 常规32位系统下unsigned int占4字节,赋值-1后得到的值为0xFFFFFFFF,对应十进制4294967295
    • 常规16位unsigned short int占2字节,赋值-1后得到的值为0xFFFF,对应十进制65535
  • 第二步:printf可变参数的默认整数提升
    printf是可变参数函数,C标准要求所有长度小于int的整数类型参数,在传入前会自动做提升:如果原类型的所有取值都能被int容纳(绝大多数系统中16位short完全可以被32位int容纳),就会被提升为有符号int。
    • 对于unsigned int u,长度和int一致,不会做提升:用%d打印时,0xFFFFFFFF被当作有符号int解析就得到-1,用%u打印得到无符号值4294967295,符合预期
    • 对于unsigned short y,会被提升为有符号int:原y的值是0xFFFF,扩展为32位int时是0x0000FFFF,对应有符号int的值就是65535,所以用%d打印自然得到65535,而不是-1。

如果要让y用%d打印出-1,只需要在传参时强制转回有符号short即可:

printf("%d", (short)y);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:39:03