C 输出中的混乱

C 输出中的混乱,c,C,我刚刚开始我的数据类型修订章节。我目前正在研究有符号和无符号字符的概念。我怀疑签名字符的范围是-128到127,那么为什么下面的代码仍然在运行呢?此外,下面的代码给出了无限的o/p,这对我来说是不可理解的 main( ) { char ch ; for ( ch = 0 ; ch <= 255 ; ch++ ) printf ( "\n%d %c", ch, ch ) ; } main() { char ch; 对于(ch=0;ch 但是,使用有符号字符,0x80变为-128 因此,现

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

main( )
{
char ch ;
for ( ch = 0 ; ch <= 255 ; ch++ )
printf ( "\n%d %c", ch, ch ) ; 
}
main()
{
char ch;
对于(ch=0;ch
但是,使用有符号字符,
0x80
变为-128

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

但是,使用有符号字符,
0x80
变为-128


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

您可能对输出感到困惑。我认为在o/p中您会看到类似的情况

0

一,

二,

3

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

33!34“。。。。 125}126~127

255� 256 257

…511� 512513..等等

0到32都是标志(不可打印的代码)
(因此你看不到输出,只看到前33个的数字),
后接字符,直到127
。你可以看到,它每255个字符就换行一次,给你相同的结果
,但它实际上在127的倍数后停止打印字符(这是127字符列表-)。它只是在127之后重置为-128,因此程序即使正在重置字符,也会继续无限打印数字。
这是因为当您对-127执行
printf(“%d”,ch)时,它会打印128个
,以此类推,直到ch=255,然后它再次翻转并开始打印256个,以此类推,但实际ch值永远不会超过127,因此它会无限大


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

你可能会对输出感到困惑。我想在o/p中你会看到类似的东西

0

一,

二,

3

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

33!34“。。。。 125}126~127

255� 256 257

…511� 512513..等等

0到32都是标志(不可打印的代码)
(因此你看不到输出,只看到前33个的数字),
后接字符,直到127
。你可以看到,它每255个字符就换行一次,给你相同的结果
,但它实际上在127的倍数后停止打印字符(这是127字符列表-)。它只是在127之后重置为-128,因此程序即使正在重置字符,也会继续无限打印数字。
这是因为当您对-127执行
printf(“%d”,ch)时,它会打印128个
,以此类推,直到ch=255,然后它再次翻转并开始打印256个,以此类推,但实际ch值永远不会超过127,因此它会无限大


一个
有符号字符c
应该给你上面的输出。字符本质上是一个8位宽的整数,但默认情况下可能在你的编译器上有符号。

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

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

为什么它不应该运行?另外,无限循环的原因正是
127
总是小于
255
。之所以运行代码,是因为for循环总是发现条件为true,即如果打开了警告,chGCC将警告此错误。为什么它不应该运行?另外,无限循环的原因正是因为
127
始终小于
255
。之所以运行代码,是因为for循环总是找到如果您打开了警告,则chGCC将警告此错误。感谢您的及时回复。因此,根据您的说法,上述代码将按如下方式运行:ch=0到ch=127 ch=-128到ch=127 ch=-128到ch=127,依此类推,直到我停止为止。对吗?是的。这正是我编译和运行它时发生的情况。感谢您的支持迅速回复。根据你的说法,上面的代码将像这样运行,直到我停止它。正确吗?是的。这正是我编译和运行它时发生的事情。使用
无符号字符ch
也会无休止地循环,因为它
s
使用
无符号字符ch
会停止当它
s
for ( ch = 0 ; ch <= 255 ; ch++ )
127 = 0x7F
128 = 0x80