0

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

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

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

4

3 回答 3

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

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

127 = 0x7F
128 = 0x80

但是,使用带符号的字符,0x80变为 -128。

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

于 2013-06-23T04:38:49.313 回答
1

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

于 2013-06-23T05:21:04.647 回答
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,因此它会变为无穷大

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

于 2013-06-23T05:00:05.437 回答