我想打印[0,255]中的所有数字,但此循环不会停止。为什么呢?
for(unsigned char i = 0; i<=255; i++)
{
cout << (int) i << endl;
}
答案 0 :(得分:8)
i
是unsigned 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(永远循环)。您可以使用short
或int
来避免此问题。
答案 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)
你的循环变量溢出。
255
是unsigned char
的最大值。 i++
然后溢出它,语言标准说它必须再次成为0
。循环永远不会到达256
,这就是循环条件说它应该终止的时候。
将i更改为unsigned int
,或者,如果您真的想节省内存,请执行以下操作:
for(unsigned char i = 0; ; i++) {
//operations
if (i == 255)
break;
}
答案 4 :(得分:1)
只是添加其他答案。您只在此处使用char
作为整数。这对读者来说极为混乱(并且具有误导性)。坚持使用正在使用的数据“有意义”的数据类型。无论你保存什么样的记忆,char
而不是int
或short
的记忆是无限小的,它永远不会重要。
如果您对与二进制文件兼容的类型感兴趣,我建议您查看<stdint.h>
的一些文档。
答案 5 :(得分:1)
循环迭代器我是无符号字符,最多可以保存1个字节或8位。这意味着范围是0到255(2 ^ 8 - 1)。并且循环按照需要工作直到i = 255但是在下一次迭代中它在i = 255 ++时失败,即256超过范围的上限,它回绕到0 [只需谷歌输出数据类型及其范围,还读取有关有符号/无符号,无符号位等],所以它再次启动i增量到255,依此类推。因此它变成了无限循环。
要解决这个问题只是让我能够保持数字256,即为它分配一个位,但我们没有任何9位大小的原始数据类型,所以我们采用更大的数据类型即短和宾果你的循环工作绝对正常。
希望这澄清..