c++ - 当操作数之一为负值时的模运算c++

标签 c++ vector modulus

我有一个 vector<int> table和一个整数 index=-833099133

当我写作时

cout<<table.size()<<endl;
cout<< index%table.size()<<endl;

它给了我:

83
  81

但是如果我写

cout<<index%83<<endl;

输出结果:

-79

有没有人帮我看看为什么会这样?提前致谢

最佳答案

table.size()类型为 std::vector<int>::size_type , 这是一个 unsigned 类型(通常是 std::size_t ),但是字面量 83是一个 int已签名。

对有符号和无符号整数执行运算时,有符号整数会隐式转换(“提升”)为无符号值。这会产生一个非负数,它是原始值对 2 的某个幂的模数(使用哪个幂取决于无符号类型的宽度)。在你的情况下,size_t是 32 位长,所以

-833099133 == 3461868163 (mod 2 ^ 32)

当然,3461868163 % 83是 81,而 -833099133 % 83是-79。 (-833099133 mod 83 将是 +4,但在 C++ 中,% 不是模数,而是余数 运算符。)

确实,如果您在 std::size_t 所在的系统上运行以下程序是 32 位长:

#include <iostream>

int main()
{
    int idx = -833099133;
    int signed83 = 83;
    std::size_t unsigned83 = 83;

    std::cout << idx % signed83 << std::endl;
    std::cout << idx % unsigned83 << std::endl;

    return 0;
}

你会得到相同的结果。

关于c++ - 当操作数之一为负值时的模运算c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355556/

相关文章:

c++ - 从回调中访问数据

c++ - 如何获取指针类型的指向类型?

algorithm - O(nlogn) 算法最小化 abs(x+y)

java - Java 中 long 的模运算符是什么?

Python 等效于 MATLAB 的冒号运算符

php - PHP 循环中的模数

c++ - 指针和整数的模糊重载?

c++ - 检测 C++ 中是否存在类型

math - 没有引用平面的两个向量之间的有符号角

java - 使用 SWT 在 Java 中呈现 SVG - Batik 太慢