模运算符(%)给出不同的结果

Gru*_*urs 6 c++ c++11

鉴于此示例:

std::vector<int> numbers = {5,6,7}; //size is 3
int i = -1; 
std::cout << i % 3 <<"\n";                  // output: -1
std::cout << i % numbers.size() << "\n";    // output: 0
Run Code Online (Sandbox Code Playgroud)

基本上在两个语句中我处理-1%3但编译器输出不同的数字.我不明白这个结果,也许有人可以向我解释.

编辑: @ Chris,@ Keith Thompson @AnT建议片段

std::cout << std::numeric_limits<std::size_t>::max() % 3 <<"\n";     //output: 0
std::cout << i % numbers.size() << "\n";                            // output: 0
Run Code Online (Sandbox Code Playgroud)

打印预期的输出.感谢大家的有益建议!

chr*_*ris 8

i % 3 是你所期望的,因为C++ 11已经定义了语义而不是实现定义(如果我没记错)结果.

numbers.size()有一个无符号类型(std::size_t).假设size_t大小int或更大,i在执行操作之前转换为相同的无符号类型.值得i到的是该类型的最大值,它看起来可以被3整除.

  • 作为旁注,在编译器上启动警告级别应该已经发现符号不匹配. (3认同)