该C程序的输出及运行原理解析:为何实际输出为-84而非-212?
程序输出结果及原理解释
代码示例
#include <stdio.h> int main() { signed char a = 200; signed char b = 3; signed char c = 2; signed char res = (a * b) / c; printf("%d\n", res); return 0; }
输出结果
-84
运行原理解释
signed char的溢出处理:
signed char是8位有符号整数,取值范围为-128 ~ 127。给a赋值200时,超出范围发生溢出,实际存储的值为200 - 256 = -56(8位有符号数以256为模循环)。整数提升与计算过程:
C语言中,小于int的整数类型(如char、short)在参与算术运算时会自动提升为int类型:a提升为int后的值是-56,b提升为int后是3,两者相乘得到-56 * 3 = -168;c提升为int后是2,用-168除以2,结果为-84。
赋值与输出:
-84在signed char的取值范围内,直接赋值给res;printf用%d输出时,res会再次提升为int类型,最终打印-84。
对错误预期的说明
你之前以为会输出-212,是错误地假设a的原始值200直接参与计算:如果用200*3=600,600/2=300,再转成signed char确实是300 - 2*256 = -212,但实际上signed char a = 200在赋值阶段就已经溢出变成-56,后续计算都是基于这个溢出后的值进行的。
内容的提问来源于stack exchange,提问作者sai praveen
相关产品推荐
相关产品推荐

