5

我试图将 255 ascii 字符写入控制台,但我有一个无限循环

for(char i=0; i<256; i++) {
    cout << i << ' ';
}
4

4 回答 4

13

因为i永远不可能大于或等于256。它会在它之前溢出。请记住,如果它是unsignedchar ,则它的类型是其最大值,否则如果它是signed255127

charunsigned还是signed,是实现定义的。char但通常,根据我的经验,它是有符号的,这意味着通常可以达到的最大值是127.

所以i从 增加0127,然后变成-128增加 到127,依此类推,如果它是有符号的。如果它是unsigned,那么它会从0to 255,然后它会变成0(由于溢出),故事又开始了,一次又一次!

于 2012-11-24T16:00:48.493 回答
5

因为的所有char都小于 256。

为了进行比较,将char i转换为int,通常会产生介于 -128 和 127 之间的值(带符号的二进制补码 8 位chars),或者如果char是无符号 8 位类型,则介于 0 和 255(含)之间。

一旦达到 a 可以保持的最大值,如果是无符号的,char进一步的增量将导致回绕到 0 ,并导致增量产生的值 128的实现定义的转换,当它被存储回来时,通常是结果是 -128,当被签名时。charintcharchar

于 2012-11-24T16:01:14.177 回答
3

您应该在编译时(-Wtautological-compare针对此问题)发出警告。

在 C++ 中,每个整数类型都有一系列可能的值。这个范围是(通常)实现定义的,尽管在通用平台(x86)上经常有:

  • signed char在 [-128, +127] (+)
  • short在 [-2* 15, 2 *15-1]
  • int在 [-2* 31, 2 *31-1]

如果你试图增加一个有符号整数类型超过它的最大值,你就进入了未定义行为的领域。在常见的实现中,它会环绕(就像无符号类型一样),所以 127 + 1 变成 -128 (对于 a char)。

与 进行比较时256,首先将值 fromi转换为 an int256不带整数后缀的类型),然后执行比较。但是,由于i始终在 [-128, 127] (+) 范围内,因此严格低于256此条件,因此条件始终为真。

(+) 是否char有符号是实现定义的,如果char是无符号的,那么它的范围更可能是 [0, 255]。

于 2012-11-24T16:14:10.237 回答
2

尝试这个!

for(int i=0; i<256; i++)
 {
    cout << char(i) << " ";
 }
于 2012-11-24T18:13:26.037 回答