我想打印[0,255]中的所有数字,但是这个循环没有停止。为什么?
for(unsigned char i = 0; i <= 255; i++) { cout << (int) i << endl; }
0s7z1bwu1#
i是一个unsigned char,它的范围通常为[0,255]。在for循环中,你会一直循环到i <= 255。当i为255时,你会向它添加1,它会绕回到0,也就是<= 255,所以循环继续。这称为unsigned integer overflow。
i
unsigned char
i <= 255
1
0
<= 255
kr98yfug2#
unsigned char的范围是[0 to 255](包括[0 to 255]);如果i小于或等于255,告诉for循环继续,会导致i再次递增,并且从255返回0(永远循环)。您可以使用short或int来避免此问题。
[0 to 255]
short
int
des4xlb03#
你正面临着一个无符号整数溢出。无论你对unsigned int做什么,它总是小于或等于它的最大值(255)。你可以使用更大的整数数据类型作为循环索引。如果你 * 仍然 * 宁愿使用unsigned char,while循环将工作:
unsigned int
while
unsigned char uc = 0; do { // stuff it in here } while (uc++ < std::numeric_limits<unsigned char>::max());
yvgpqqbh4#
你的循环变量溢出了。255是unsigned char。i++然后溢出它,语言标准说它必须再次成为0。循环永远不会到达256,这是循环条件说它应该终止的时候。将i更改为unsigned int,或者,如果您真的想保存内存,只需执行以下操作:
255
i++
256
for(unsigned char i = 0; ; i++) { //operations if (i == 255) break; }
pengsaosao5#
只是为了补充其他的答案。你在这里只使用了一个整数char。这对读者来说是非常混乱的(和误导的)。坚持使用与所使用的数据“有意义”的数据类型。无论你节省了多少内存,我把它变成了char而不是int或short是如此的小,以至于它永远不会有问题。但是,如果您对能很好地使用二进制的类型感兴趣,我建议您查看一些<stdint.h>的文档。
char
<stdint.h>
rggaifut6#
你的循环迭代器i是无符号char,它最多可以保存1个字节或8位。这意味着范围是到255(2^8 - 1)。循环按预期工作,直到i=255,但在下一次迭代中,当i=255++时失败,即256超出范围的上限,它返回到0 [只需谷歌出数据类型及其范围,也读到了有符号/无符号,无符号位等],所以它再次开始递增i,直到255,依此类推。因此,它变成了一个无限循环。为了解决这个问题,只需让i能够容纳数字256,即再分配一个位给它,但我们没有任何大小为9位的原始数据类型,因此我们采用直接更大的数据类型,即短和宾果你的循环工作得非常好。希望这能澄清…
koaltpgm7#
在8位时代,这是一个重要的循环,汇编计数器可以处理它。由于求值顺序的原因,它在C中的for循环中不起作用。然而,他们使用的相同技巧可以通过do-while重现。
unsigned char i = 0xFF; do printf("%u ", ++i); while (i !=255);
当然这种类型的代码只适合复古或非常小的嵌入式系统编程。这一个简单而直接:
for (unsigned char i=0; i<255; i++) printf("%u ", i); printf("%u ", i);
7条答案
按热度按时间0s7z1bwu1#
i
是一个unsigned char
,它的范围通常为[0,255]。在for循环中,你会一直循环到i <= 255
。当i
为255时,你会向它添加1
,它会绕回到0
,也就是<= 255
,所以循环继续。这称为unsigned integer overflow。kr98yfug2#
unsigned char
的范围是[0 to 255]
(包括[0 to 255]
);如果i小于或等于255,告诉for循环继续,会导致i再次递增,并且从255返回0(永远循环)。您可以使用short
或int
来避免此问题。des4xlb03#
你正面临着一个无符号整数溢出。无论你对
unsigned int
做什么,它总是小于或等于它的最大值(255)。你可以使用更大的整数数据类型作为循环索引。如果你 * 仍然 * 宁愿使用unsigned char
,while
循环将工作:yvgpqqbh4#
你的循环变量溢出了。
255
是unsigned char
。i++
然后溢出它,语言标准说它必须再次成为0
。循环永远不会到达256
,这是循环条件说它应该终止的时候。将i更改为
unsigned int
,或者,如果您真的想保存内存,只需执行以下操作:pengsaosao5#
只是为了补充其他的答案。你在这里只使用了一个整数
char
。这对读者来说是非常混乱的(和误导的)。坚持使用与所使用的数据“有意义”的数据类型。无论你节省了多少内存,我把它变成了char
而不是int
或short
是如此的小,以至于它永远不会有问题。但是,如果您对能很好地使用二进制的类型感兴趣,我建议您查看一些
<stdint.h>
的文档。rggaifut6#
你的循环迭代器i是无符号char,它最多可以保存1个字节或8位。这意味着范围是到255(2^8 - 1)。循环按预期工作,直到i=255,但在下一次迭代中,当i=255++时失败,即256超出范围的上限,它返回到0 [只需谷歌出数据类型及其范围,也读到了有符号/无符号,无符号位等],所以它再次开始递增i,直到255,依此类推。因此,它变成了一个无限循环。
为了解决这个问题,只需让i能够容纳数字256,即再分配一个位给它,但我们没有任何大小为9位的原始数据类型,因此我们采用直接更大的数据类型,即短和宾果你的循环工作得非常好。
希望这能澄清…
koaltpgm7#
在8位时代,这是一个重要的循环,汇编计数器可以处理它。由于求值顺序的原因,它在C中的for循环中不起作用。然而,他们使用的相同技巧可以通过do-while重现。
当然这种类型的代码只适合复古或非常小的嵌入式系统编程。
这一个简单而直接: