使用unsigned char计数器从0到255的无限循环

时间:2015-07-22 18:39:11

标签: c++

我想打印[0,255]中的所有数字,但此循环不会停止。为什么呢?

for(unsigned char i = 0; i<=255; i++)
{   
    cout << (int) i << endl;
}

6 个答案:

答案 0 :(得分:8)

iunsigned char,其范围通常为[0,255]。在你循环中,你将一直到i <= 255。当i为255时,您向其添加1并将其回绕到0 <= 255,以便循环继续。这称为unsigned integer overflow

答案 1 :(得分:3)

unsigned char的范围为[0 to 255];如果i小于或等于255则告诉for循环继续使它再次递增i,并且它从255回复到0(永远循环)。您可以使用shortint来避免此问题。

答案 2 :(得分:3)

您正面临无符号整数溢出。无论你对unsigned int做什么,它总是小于或等于其最大值(255)。您可以使用更大的整数数据类型作为循环索引。如果你仍然而不是unsigned char,那么while循环就可以了:

unsigned char uc = 0;
do {
  // stuff it in here
} while (uc++ < std::numeric_limits<unsigned char>::max());

答案 3 :(得分:2)

你的循环变量溢出。

255unsigned char的最大值。 i++然后溢出它,语言标准说它必须再次成为0。循环永远不会到达256,这就是循环条件说它应该终止的时候。

将i更改为unsigned int,或者,如果您真的想节省内存,请执行以下操作:

for(unsigned char i = 0; ; i++) {
    //operations
    if (i == 255)
        break;
}

答案 4 :(得分:1)

只是添加其他答案。您只在此处使用char作为整数。这对读者来说极为混乱(并且具有误导性)。坚持使用正在使用的数据“有意义”的数据类型。无论你保存什么样的记忆,char而不是intshort的记忆是无限小的,它永远不会重要。

如果您对与二进制文件兼容的类型感兴趣,我建议您查看<stdint.h>的一些文档。

答案 5 :(得分:1)

循环迭代器我是无符号字符,最多可以保存1个字节或8位。这意味着范围是0到255(2 ^ 8 - 1)。并且循环按照需要工作直到i = 255但是在下一次迭代中它在i = 255 ++时失败,即256超过范围的上限,它回绕到0 [只需谷歌输出数据类型及其范围,还读取有关有符号/无符号,无符号位等],所以它再次启动i增量到255,依此类推。因此它变成了无限循环。

要解决这个问题只是让我能够保持数字256,即为它分配一个位,但我们没有任何9位大小的原始数据类型,所以我们采用更大的数据类型即短和宾果你的循环工作绝对正常。

希望这澄清..