繁体   English   中英

从0到255的无穷大字符计数器中的无限循环

[英]Infinite loop in a for from 0 to 255 with unsigned char counter

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

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

i是一个unsigned char ,通常范围为[0,255]。 在for循环中,直到i <= 255为止。 i为255时,向其添加1 ,然后回绕到0 ,即<= 255因此循环继续进行。 这称为无符号整数溢出

unsigned char的范围为[0 to 255]含); 告诉for循环如果i小于或等于255继续,将使其再次增加i,然后从255换回0(永远循环)。 您可以使用shortint来避免出现此问题。

您正面临无符号整数溢出。 无论您对unsigned int采取什么措施,它总是会小于或等于其最大值(255)。 您可以改为使用较大的整数数据类型作为循环索引。 如果您仍然希望使用unsigned char ,那么while循环将起作用:

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

您的循环变量溢出。

255unsigned char的最大值。 然后, i++溢出它,并且语言标准说它必须再次变为0 循环永远不会达到256 ,这是循环条件要求终止的时间。

将i更改为unsigned int或者,如果您确实要节省内存,则只需执行以下操作:

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

只是添加到其他答案。 您仅在此处使用char作为整数。 这给读者带来极大的困惑(并产生误导)。 坚持使用正在使用的数据“有意义”的数据类型。 无论您要保存多少内存,而将其设置为char而不是intshort都是如此之小,以至于永远都没有关系。

但是,如果您对与二进制文件一起使用的类型感兴趣,建议您查看<stdint.h>一些文档。

循环迭代器i是无符号字符,最多可容纳1个字节或8位。 这意味着范围是0到255(2 ^ 8-1)。 并且循环按期望的方式工作,直到i = 255,然后在下一次迭代中,当i = 255 ++时失败,即256(超过范围的上限),它回绕为0 [仅用谷歌搜索出数据类型及其范围,也请阅读有关有符号/无符号,无符号位等的内容],因此它再次开始将i递增至255,依此类推。 因此,它变成了无限循环。

要解决该问题,只需使我能够保留数字256,即为其分配一个更多的位,但是我们没有大小为9位的任何原始数据类型,因此我们采用直接较大的数据类型,即short和bingo您的循环有效绝对好

希望这可以澄清..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM