我刚刚开始我的数据类型修订章节。我目前正在研究有符号和无符号字符的概念。我怀疑签名字符的范围从-128到127,那么为什么下面的代码仍在运行?此外,下面的代码给出了我无法理解的无限 o/p。
main( )
{
char ch ;
for ( ch = 0 ; ch <= 255 ; ch++ )
printf ( "\n%d %c", ch, ch ) ;
}
我目前正在使用 GCC 32 位编译器。谁能帮我解释一下上述代码的o/p?
我刚刚开始我的数据类型修订章节。我目前正在研究有符号和无符号字符的概念。我怀疑签名字符的范围从-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 之后重置,因此即使它正在重置字符,程序也会继续将数字打印到无穷大。这是因为当你这样做时printf("%d",ch) for -127 it prints 128
,依此类推,直到 ch = 255,然后它再次翻转并开始打印 256 等等,但实际的 ch 值永远不会超过 127,因此它会变为无穷大
Asigned char c
你应该给你上面的输出。char 本质上是一个 8 位宽的整数,但默认情况下可能会在您的编译器上签名。