为何C语言中unsigned short(0xffff)输出65535而unsigned int(0xffffffff)输出-1?
问题分析与解答
核心问题
代码中格式符与变量类型不匹配:printf的%d用于输出有符号十进制整数(int类型),但传入的是无符号类型变量(unsigned short、unsigned int),这会触发未定义行为,导致输出不符合预期。
具体输出逻辑解释
- 对于
unsigned short u_short = 0xffff:
调用printf时,unsigned short会自动提升为int(int精度高于short)。0xffff作为无符号短整数对应数值65535,提升为int后是0x0000ffff,这个值作为有符号int仍为65535,因此%d输出65535。 - 对于
unsigned int u_int = 0xffffffff:
用%d输出时,0xffffffff会被当作有符号int的补码解析。在32位系统中,该值对应有符号int的最小值-1,所以输出结果为-1。
修复方案
使用无符号整数对应的格式符:
unsigned short对应%huunsigned int对应%u
修改后的代码:
#include <stdio.h> unsigned short u_short = 0xffff; unsigned int u_int = 0xffffffff; int main(){ printf("unsigned short = %hu\n", u_short); printf("unsigned int = %u\n", u_int); return 0; }
修改后正确输出:
unsigned short = 65535 unsigned int = 4294967295
内容的提问来源于stack exchange,提问作者Cplan
相关产品推荐
相关产品推荐

