我刚刚开始修改数据类型章节。我目前正在研究签名和无符号字符的概念。我怀疑签名字符的范围是-128到127,那么为什么以下代码仍在运行?此外,下面的代码给出了我无法理解的无限o / p。
main( )
{
char ch ;
for ( ch = 0 ; ch <= 255 ; ch++ )
printf ( "\n%d %c", ch, ch ) ;
}
我目前正在使用GCC 32位编译器。有谁可以帮我解释上述代码的o / p?
答案 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~127255 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位宽的整数,但默认情况下可能在您的编译器上签名。