1

我正在使用 c++ 中的环形 2D 网格(即它在两侧环绕),并编写了一个明显的邻居/相对点函数:

point neighbor(point p0, int dx, int dy)
{
    point p=p0;
    p.x += dx;
    p.y += dy;
    p.x %= width; if(p.x<0) p.x += width;
    p.y %= height; if(p.y<0) p.y += height;
    return p;
}

我完全不知道为什么我的程序不工作,因为这个功能的实现似乎微不足道。

我以为我理解 % 运算符,我什至记得检查是否有负面结果。尽管如此,我还是开始尝试它。'width' 是一个无符号值,值为 160,所以我尝试了:

cout << (-1) % 160u;

...我很震惊地看到 95 的结果。

到底他妈发生了什么?

4

1 回答 1

1

事实证明,我的程序没有将未签名的 160u 转换为 int。
相反,-1 被转换为无符号数,变成 4294967295,实际上当被 160 修改后得到 95。

为什么 c++ 这样做超出了我的理解,但我发布这个是为了让其他人可以从我的经验中学习。底线:使用时不要混合有符号和无符号整数%

于 2012-10-13T23:35:21.763 回答