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

无限循环中int或char最终输出负值?signed char输出-128原因是什么

有符号整型递增后出现负值的原因

这个现象的核心逻辑是有符号整数溢出的补码处理规则:C标准本身将有符号整数溢出归为未定义行为,但当前几乎所有主流编译器都采用补码规则处理这类溢出,是最终出现负值的原因。

针对你给出的示例代码:

#include <stdio.h>

int main()
{
    signed char x = 0;
    for (; x >= 0; x++);
    printf("%d\n", x);
    return 0;
}

输出-128的具体成因可以拆解为以下几点:

  • 主流系统中signed char占1字节共8位,采用补码表示时的取值范围是 -128 ~ 127,最高位为符号位,0代表正数,1代表负数。
  • 循环的执行条件是x >= 0,所以x会从0开始持续递增:1、2……直到127,此时仍然满足循环条件,会再执行一次x++操作。
  • 127对应的8位补码是01111111,加1后二进制变为10000000,按照补码规则,这个值对应的十进制就是-128。
  • 此时x取值为-128,不满足x >= 0的条件,循环终止,最终输出结果就是-128。

对于int等其他有符号整型来说逻辑完全一致:当递增到该类型的最大正值后再加1,最高位符号位会被翻转为1,对应的值就会变为该类型的最小负值,也就是你观察到的递增后出现负数的情况。

内容的提问来源于stack exchange,提问作者HARMANPREET SINGH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:27:02