C语言变量输出值由何决定?声明类型还是printf格式说明符?
C语言整数溢出与printf输出的核心逻辑
核心结论:变量的实际存储值由声明类型+整数溢出规则决定,最终输出结果完全由printf使用的格式说明符决定。结合你的代码逐一拆解:
变量a的情况(short int a = 32771)
存储阶段:溢出后的数值确定
short int是16位有符号整数,范围为-32768 ~ 32767,32771明显超出上限。在主流补码实现中,超出范围的有符号整数会按循环取模处理:- 32771的16位二进制为
10000000 00000011 - 最高位为1代表负数,补码转原码后结果为
-32765,这就是变量a实际存储的值。
- 32771的16位二进制为
输出阶段:格式说明符的影响
printf("%d", a):short类型会被自动提升为int(C语言可变参数的默认提升规则),负数会进行符号扩展(32位二进制为11111111 11111111 10000000 00000011),%d按有符号int解析,输出-32765。printf("%u", a):同样先提升为int,符号扩展后的二进制被%u按无符号int解析,计算后得到4294934531。
变量b的情况(int b = 32771)
存储阶段:无溢出,原值存储
int是32位有符号整数,32771在其范围内(通常-2^31 ~ 2^31-1),变量b直接存储32771的完整32位二进制:00000000 00000000 10000000 00000011。输出阶段:格式说明符的截断/解析规则
printf("%hd", b):%hd要求按有符号short int解析,printf会把32位int值截断为低16位(即10000000 00000011),作为有符号short处理时结果为-32765。printf("%hu", b):%hu要求按无符号short int解析,截断后的低16位二进制作为无符号数计算,结果就是32771。
内容的提问来源于stack exchange,提问作者Abhijeet Gautam
相关产品推荐
相关产品推荐

