为什么它是无限循环?

时间:2012-11-24 15:59:46

标签: c++ char infinite-loop integer-overflow

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

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

4 个答案:

答案 0 :(得分:13)

因为i永远不会大于或等于256。它会在它之前溢出。请记住,它的类型为char,如果未签名,则其最大值可以为255,否则127如果已签名

char未签名还是签名,是否是实现定义的。但通常,根据我的经验,它已签名,这意味着通常char可以达到的最大值为127

所以i0增加到127,然后变为-128,从那里增加到127,依此类推,如果它是< EM>签名。如果它是未签名,那么它将从0转到255,然后它将变为0(由于溢出),故事又重新开始,再一次!

答案 1 :(得分:5)

因为 char的所有值都小于256。

为了进行比较,char i转换为int,通常会产生-128到127之间的值(带有符号的二进制补码8位char s),或者如果char是无符号8位类型,则在0到255之间(包括)。

一旦达到char可以保持的最大值,如果char未签名,则进一步增加将导致环绕为0,并且int的实现定义转换将导致1}}值128,当char被存储时,增量产生到char,当{{1}}被签名时,结果通常为-128。

答案 2 :(得分:3)

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

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

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

如果您尝试将有符号整数类型增加到超出其最大值,则输入未定义行为的范围。在常见的实现中,它包装(就像无符号类型一样),因此127 + 1变为-128(对于char)。

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

(+)实现定义char是否已签名,如果char未签名则其范围更可能是[0,255]。

答案 3 :(得分:2)

试试这个!

for(int i=0; i<256; i++)
 {
    cout << char(i) << " ";
 }