C++ for循环中的无符号整数

Ben*_*min 11 c++ for-loop unsigned-integer

我在Stackoverflow上对C++中的反向循环进行了一些研究,它使用无符号整数而不是有符号整数.但我仍然不明白为什么会出现问题(请参阅带有for循环的Unsigned int反向迭代).为什么以下代码会产生分段错误?

#include <vector>
#include <iostream>
using namespace std;

int main(void)
{
    vector<double> x(10);

    for (unsigned int i = 9; i >= 0; i--)
    {
        cout << "i= " << i << endl;
        x[i] = 1.0;
    }

    cout << "x0= " << x[0] << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我明白问题是当索引i等于零时,因为有类似溢出的东西.但我认为无符号整数可以取零值,不是吗?现在,如果我用有符号整数替换它,那绝对没有问题.

有人能用无符号整数向我解释反向循环背后的机制吗?

非常感谢你!

Mys*_*ial 26

这里的问题是无符号整数永远不会是负数.

因此,循环测试:

i >= 0
Run Code Online (Sandbox Code Playgroud)

永远都是真的.因此,你得到一个无限循环.

当它低于零时,它会回绕到unsigned最大值.
因此,您也将访问x[i]越界.

这对于有符号整数来说不是问题,因为它只会变为负数而因此失败i >= 0.

因此,如果要使用无符号整数,可以尝试以下方法之一:

for (unsigned int i = 9; i-- != 0; )
Run Code Online (Sandbox Code Playgroud)

for (unsigned int i = 9; i != -1; i--)
Run Code Online (Sandbox Code Playgroud)

这两个是由GManNickG和AndreyT在评论中提出的.


这是我最初的3个版本:

for (unsigned int i = 9; i != (unsigned)0 - 1; i--)
Run Code Online (Sandbox Code Playgroud)

要么

for (unsigned int i = 9; i != ~(unsigned)0; i--)
Run Code Online (Sandbox Code Playgroud)

要么

for (unsigned int i = 9; i != UINT_MAX; i--)
Run Code Online (Sandbox Code Playgroud)

  • 或者`for(unsigned int i = 9; i--!= 0;)` (3认同)
  • @josefx只有有符号整数溢出/下溢是未定义的行为. (2认同)
  • 我不确定所有这些复杂条件的目的是什么.你可以简单地做`for(unsigned int i = 9; i!= -1; i - )`.不需要任何演员阵容.与`-1`的直接比较将自动执行所有必要的转换.在这种情况下,`-1`相当于`UINT_MAX`,但`-1`更好,因为它与类型无关. (2认同)
  • @GManNickG 的答案很简洁,但它需要从 10 开始而不是 9 `for (unsigned int i = 10; i-- != 0; )` (2认同)

MAK*_*MAK 6

问题是,你的循环允许i低至零,并且只有当i小于0时才会退出循环.因为我是无符号的,它永远不会小于0.它会翻到2 ^ 32-1 .这大于矢量的大小,因此导致段错误.