为什么用%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
- 常规32位系统下
- 第二步: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
相关产品推荐
相关产品推荐

