当其中一个操作数为负值c ++时的模数运算

时间:2014-01-25 20:01:11

标签: c++ vector modulus

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

写作时

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

它给了我:

83
  81

然而如果我写

cout<<index%83<<endl;

输出结果:

-79

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

1 个答案:

答案 0 :(得分:2)

table.size()属于std::vector<int>::size_type类型,是无符号类型(通常为std::size_t),但文字83为{{ 1}}签名。

对有符号和无符号整数执行操作时,已签名的整数将被隐式转换(“提升”)为无符号值。这导致非负数,这是原始值模数为2的幂(使用的功率取决于无符号类型的宽度)。在您的情况下,int长度为32位,所以

size_t

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

实际上,如果在%为32位长的系统上运行以下程序:

std::size_t

你会得到相同的结果。