这个程序的输出是什么以及如何?

Mid*_*hun 0 c overflow char

#include <stdio.h> 
 int main() 
{   char i=0;            
    for(;i>=0;i++);     
    printf("%d",i);     
    return 0; 
 }
Run Code Online (Sandbox Code Playgroud)

该程序的输出为-128.据我所知,字符变量将溢出,所有位将为0.并且取两个补码将再次为0.有人可以解释这个过程吗?

编辑:只是为了澄清这不是我的计划.这是竞争性考试中的编程问题.

小智 5

你对溢出的假设是不正确的.溢出无符号类型会将所有位设置为零,但是未定义溢出有符号类型,因此可能导致任何值.

因此,您获得的结果取决于您的(编译器)实现.可以解释一下

  • 您的实施已签署 char.
  • A char有8位.
  • 负数用2的补码表示.
  • 签名值的溢出将导致环绕.(这是使用2的补码进行简单实现的结果,见下文)

鉴于所有这些假设(并且记住,这些假设都没有由C指定),增量127作为最大可能char值(表示为0111 1111)得出-128最小可能值(表示为1000 0000).

TL; DR - 您的代码未定义,请勿编写此类代码.