c++ - % (mod) 混合签名

标签 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 分的结果我很震惊。

这到底是怎么回事?

最佳答案

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

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

关于c++ - % (mod) 混合签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12877988/

相关文章:

c++ - C/C++,NTFS。多个重解析点

c++ - 如果动态和静态版本都存在,如何告诉 qmake 使用静态库?

operators - NASM 中的 MUL 运算符与 IMUL 运算符

C++ 从另一个类调用( vector )指针返回空大小

c++ - 如何声明可变数量的模板参数?

C# - is 运算符 - 检查所有可用转换的可铸性

php - PHP 中的变量运算符

c++ - 碱基转换问题

python - 查找不能被 x 到 y 整除的 a 到 b 的数字

c - 哪个操作需要更多的 CPU 时钟,取模还是比较?