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

时间:2015-03-26 01:29:41

标签: 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

基本上在两个语句中我处理-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

打印预期输出。感谢大家的有用建议!

2 个答案:

答案 0 :(得分:8)

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

numbers.size()具有无符号类型(std::size_t)。假设size_tint或更大一样大,i在执行操作之前将转换为相同的无符号类型。值i获取的值将是该类型的最大值,它可以被3整除。

答案 1 :(得分:0)

问题是在C ++中没有很好地定义负数的百分比。