为什么写时会进入无限循环(char c = 0; c <256; c ++)?

KAR*_*RAO 0 c c++

这是代码的方式:

for(char c=0;c<256;c++)
  printf("hello");
Run Code Online (Sandbox Code Playgroud)

为什么会进入无限循环?

Mys*_*ial 10

这是因为char在你的情况下是一个8位整数.

因此,char只有拥有值-128127,这始终是小于256.

  • `unsigned char`也会有同样的问题,不是吗?0-255. (7认同)
  • 应该注意的是,`char`可以是有符号的或无符号的,并且当然在任何一种情况下都会无限循环. (6认同)
  • @Chris:不,如果`char`被签名,循环将调用UB; 特别是**它可以**终止. (2认同)

pax*_*blo 6

您的char数据类型可能限制为8位.如果默认char是有符号的,8位且你正在使用twos'complement,它将始终在范围内,-128..127因此总是小于256.

如果它是无符号的 8位(编码无关紧要,因为它只影响有符号数),它将始终在0.255范围内,因此也总是低于256.

请注意,C不强制要求两个补码,因此范围可能会稍微改变,但所有编码的可能性只有8位,它可以具有的最高值255.

只有当你有超过8位可用时才能char达到256.这是可能的,因为C只强制要求最小位数.您可以通过查找来查看您的实现提供的内容CHAR_BITS,<limits.h>但在绝大多数情况下,这将是8.

为了完整起见,三种可能的C编码的八位范围是:

                        signed      unsigned
                        =========   ========
one's complement        -127..127   0..255
sign/magnitude          -127..127   0..255
two's complement        -128..127   0..255
Run Code Online (Sandbox Code Playgroud)

  • 这是一件小事,但在第二段中说"无符号二的补码"真的有意义吗? (2认同)