【问题标题】:modulus operation when one of the operand is negative value c++当操作数之一为负值c ++时的模运算
【发布时间】:2014-01-25 20:01:10
【问题描述】:

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

当我写作时

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

它给了我:

83
  81

如果我写

cout<<index%83<<endl;

输出结果:

-79

有没有人可以帮助我为什么会发生这种情况?提前谢谢

【问题讨论】:

  • table.size() 是无符号的,83 是一个有符号的int……然后是整数提升,一些黑魔法,你得到了结果。
  • @H2CO3 谢谢回复,能不能写成我想接受的答案

标签: c++ vector modulus


【解决方案1】:

table.size()std::vector&lt;int&gt;::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;
}

你会得到同样的结果。

【讨论】:

    猜你喜欢
    • 2017-01-13
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2015-07-23
    相关资源
    最近更新 更多