无限循环中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
相关产品推荐
相关产品推荐

