输出混乱

时间:2013-06-23 04:32:18

标签: c

我刚刚开始修改数据类型章节。我目前正在研究签名和无符号字符的概念。我怀疑签名字符的范围是-128到127,那么为什么以下代码仍在运行?此外,下面的代码给出了我无法理解的无限o / p。

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

我目前正在使用GCC 32位编译器。有谁可以帮我解释上述代码的o / p?

3 个答案:

答案 0 :(得分:4)

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

如果ch是有符号字符,它将从0开始并递增到127.然后,在下一个增量处,它将“环绕”并变为-128。使用无符号 char

127 = 0x7F
128 = 0x80

但是,使用签名的字符,0x80变为-128。

所以现在ch将从-128到127运行。由于所有这些值都小于255,这将重复,直到你停止程序..

答案 1 :(得分:1)

因为有符号字符是从-128到127,它的二进制数是10000000和01111111,当'ch'运行到127时,下一个增量'ch'将变成-128,总是小于255,所以它将是无限的o /第

答案 2 :(得分:0)

您可能对输出感到困惑。我想在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之后重置,因此程序继续将数字打印到无穷大,即使它正在重置字符。 这是因为当你执行printf("%d",ch) for -127 it prints 128时,直到ch = 255,然后它再次翻转并开始打印256以后依此类推,但实际ch值永远不会超过127,因此它会变为无穷大

signed char c你应该给你上面的输出吗? char本质上是一个8位宽的整数,但默认情况下可能在您的编译器上签名。