具有混合签名的%(mod)

时间:2012-10-13 23:35:22

标签: c++ operators modulo

我正在使用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的结果。

到底发生了什么事?

1 个答案:

答案 0 :(得分:1)

事实证明,我的程序没有将无符号的160u转换为int 相反,-1被转换为无符号变为4294967295,实际上在由160修改时给出95.

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