c++ 在for中使用unsigned char计数器从0到255进行无限循环

xwbd5t1u  于 2023-04-13  发布在  其他
关注(0)|答案(7)|浏览(425)

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

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

0s7z1bwu1#

i是一个unsigned char,它的范围通常为[0,255]。在for循环中,你会一直循环到i <= 255。当i为255时,你会向它添加1,它会绕回到0,也就是<= 255,所以循环继续。这称为unsigned integer overflow

kr98yfug

kr98yfug2#

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

des4xlb0

des4xlb03#

你正面临着一个无符号整数溢出。无论你对unsigned int做什么,它总是小于或等于它的最大值(255)。你可以使用更大的整数数据类型作为循环索引。如果你 * 仍然 * 宁愿使用unsigned charwhile循环将工作:

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

yvgpqqbh4#

你的循环变量溢出了。
255unsigned chari++然后溢出它,语言标准说它必须再次成为0。循环永远不会到达256,这是循环条件说它应该终止的时候。
将i更改为unsigned int,或者,如果您真的想保存内存,只需执行以下操作:

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

pengsaosao5#

只是为了补充其他的答案。你在这里只使用了一个整数char。这对读者来说是非常混乱的(和误导的)。坚持使用与所使用的数据“有意义”的数据类型。无论你节省了多少内存,我把它变成了char而不是intshort是如此的小,以至于它永远不会有问题。
但是,如果您对能很好地使用二进制的类型感兴趣,我建议您查看一些<stdint.h>的文档。

rggaifut

rggaifut6#

你的循环迭代器i是无符号char,它最多可以保存1个字节或8位。这意味着范围是到255(2^8 - 1)。循环按预期工作,直到i=255,但在下一次迭代中,当i=255++时失败,即256超出范围的上限,它返回到0 [只需谷歌出数据类型及其范围,也读到了有符号/无符号,无符号位等],所以它再次开始递增i,直到255,依此类推。因此,它变成了一个无限循环。
为了解决这个问题,只需让i能够容纳数字256,即再分配一个位给它,但我们没有任何大小为9位的原始数据类型,因此我们采用直接更大的数据类型,即短和宾果你的循环工作得非常好。
希望这能澄清…

koaltpgm

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);

相关问题