簡體   English   中英

該程序的輸出是什么?

[英]What is the output of this program and how?

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

該程序的輸出為-128。 據我所知,字符變量將溢出並且所有位將為0。並且采用二進制補碼將再次為0。有人可以解釋這個過程嗎?

編輯 :只是要澄清這不是我的程序。 這是競爭性考試中的編程問題。

您關於溢出的假設是不正確的。 溢出無符號類型會將所有位設置為零,但是溢出有符號類型是未定義的 ,因此可能導致任何值。

因此,您得到的結果取決於您的(編譯器)實現。 可以解釋一下

  • 您的實現已簽名 char
  • char有8位。
  • 負數以2的補碼表示。
  • 有符號值的溢出將導致環繞 (這是使用2的補碼進行簡單實現的結果,請參見下文)

鑒於所有這些假設(記住,這些都不是被C指定),遞增127以最大可能char值(表示為0111 1111 )產生-128 ,最小可能的值(表示為1000 0000 )。

TL; DR-您的代碼未定義,請勿編寫此類代碼。

由於您的字符已簽名,因此它可以介於-128到127(8位)之間,因為您在遞增,直到它達到最大值,然后溢出並變為-值,因為這就是將負值寫入位的方式。 看看下面的圖片:

在此處輸入圖片說明

ps在循環中進行一些打印,您也可以自己弄清楚。

實際上,在每次迭代中,循環都會使i遞增1 ,這使我們i = 127

  • 現在,讓我們看一下其二進制表示0111-1111
  • 現在,如果我們將其增加1
  • 0111-1111 + 0000-0001 = 1000-0000
  • 現在,分析一下,MSB已設置,這意味着它是負數
  • 負數另存為2的補數
  • 2的補數1000-0000 = -127
  • 因此循環中斷

希望你能得到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM