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

Modulo Operator (%) gives divergent results

本文关键字:结果 运算符      更新时间:2023-10-16

给定此示例:

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

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

打印预期输出。谢谢你给大家的有益建议!

i % 3是您所期望的,并且自C++11以来,它定义了语义,而不是定义了实现(如果我记得正确的话)结果。

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

问题是在C++中没有定义负数的%。