簡體   English   中英

輸出混亂

[英]Confusion in the output

我剛剛開始修改數據類型一章。 我目前正在研究有符號和無符號字符的概念。 我的懷疑是簽名的char的范圍是-128到127,那么為什么下面的代碼仍在運行? 另外,下面的代碼給出了無限的o / p,這對我來說是無法理解的。

main( )
{
char ch ;
for ( ch = 0 ; ch <= 255 ; ch++ )
printf ( "\n%d %c", ch, ch ) ; 
}

我目前正在使用GCC 32位編譯器。 誰能幫我解釋一下上面代碼的o / p嗎?

for ( ch = 0 ; ch <= 255 ; ch++ )

如果ch是帶符號的字符,它將從0開始並遞增到127。然后,在下一個增量,它將“環繞”並變為-128。 使用未簽名的 char

127 = 0x7F
128 = 0x80

但是,使用帶符號的字符, 0x80變為-128。

因此,現在ch將在-128到127之間運行。由於所有這些值均小於255,因此將重復該操作,直到停止程序為止。

因為帶符號的字符是從-128到127,它的二進制數是10000000和01111111,當“ ch”運行到127時,下一個增量“ ch”將變為-128,始終小於255,因此它將是無限的o / p。

您可能對輸出感到困惑。 我認為在o / p中您會看到類似的內容。

0

1

2

3 ...

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ...

33! 34英寸.... 125} 126〜127

255 256 257

... 511 512 513 ..等

0 to 32 are all flags(unprintable codes) (因此看不到輸出,但只有前33個數字), followed by characters till 127 如您所見,它每隔255個字符會自動換行,以提供相同的結果, but it actually stops printing characters after multiples of 127 (這是127個字符列表-http: //web.cs.mun.ca/~michael/ c / ascii-table.html )。 它只是在127之后重置為-128,因此即使重置了char,該程序仍繼續將數字打印為無窮大。 這是因為當您printf("%d",ch) for -127 it prints 128執行printf("%d",ch) for -127 it prints 128 ,依此類推,直到ch = 255,然后再次翻轉並開始打印256,依此類推,但是實際的ch值永遠不會超過127,因此達到無窮大

如果您要提供上述輸出,請使用已signed char c 一個char本質上是一個8位寬的整數,但是默認情況下可能在您的編譯器上簽名。

暫無
暫無

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

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