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

该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

运行原理解释

  1. signed char的溢出处理:
    signed char是8位有符号整数,取值范围为-128 ~ 127。给a赋值200时,超出范围发生溢出,实际存储的值为 200 - 256 = -56(8位有符号数以256为模循环)。

  2. 整数提升与计算过程:
    C语言中,小于int的整数类型(如char、short)在参与算术运算时会自动提升为int类型:

    • a提升为int后的值是-56,b提升为int后是3,两者相乘得到 -56 * 3 = -168;
    • c提升为int后是2,用-168除以2,结果为-84。
  3. 赋值与输出:
    -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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:19:54