为什么模运算符会产生负值?

发布于 2024-12-07 07:28:51 字数 186 浏览 1 评论 0原文

为什么这样的操作会

std::cout << (-7 % 3) << std::endl;
std::cout << (7 % -3) << std::endl;

产生不同的结果?

-1
1

Why do such operations:

std::cout << (-7 % 3) << std::endl;
std::cout << (7 % -3) << std::endl;

give different results?

-1
1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花辞树 2024-12-14 07:28:51

从 ISO14882:2011(e) 5.6-4 开始:

二元 / 运算符产生商,二元 % 运算符产生商
产生第一个表达式除以的余数
第二。如果 / 或 % 的第二个操作数为零,则行为为
不明确的。对于整数操作数, / 运算符产生代数商,并丢弃任何小数部分;如果商 a/b 是
以结果类型表示,(a/b)*b + a%b 等于 a。

剩下的就是基本数学:

(-7 / 3) => -2
-2 * 3   => -6
so a % b => -1

(7 / -3) => -2
-2 * -3  => 6
so a % b => 1

请注意

如果两个操作数均为非负,则余数为非负;如果
不是,余数的符号是​​实现定义的。

ISO14882:2003(e) 中的内容不再出现在 ISO14882:2011(e) 中

From ISO14882:2011(e) 5.6-4:

The binary / operator yields the quotient, and the binary % operator
yields the remainder from the division of the first expression by the
second. If the second operand of / or % is zero the behavior is
undefined. For integral operands the / operator yields the algebraic quotient with any fractional part discarded; if the quotient a/b is
representable in the type of the result, (a/b)*b + a%b is equal to a.

The rest is basic math:

(-7 / 3) => -2
-2 * 3   => -6
so a % b => -1

(7 / -3) => -2
-2 * -3  => 6
so a % b => 1

Note that

If both operands are nonnegative then the remainder is nonnegative; if
not, the sign of the remainder is implementation-defined.

from ISO14882:2003(e) is no longer present in ISO14882:2011(e)

桃酥萝莉 2024-12-14 07:28:51
a % b

在 c++ 中默认:

(-7 / 3) => -2
-2 * 3   => -6
so a % b => -1

(7 / -3) => -2
-2 * -3  => 6
so a % b => 1

在 python 中:

-7 % 3 => 2
7 % -3 => -2

在 c++ 到 python 中:

(b + (a % b)) % b
a % b

in c++ default:

(-7 / 3) => -2
-2 * 3   => -6
so a % b => -1

(7 / -3) => -2
-2 * -3  => 6
so a % b => 1

in python:

-7 % 3 => 2
7 % -3 => -2

in c++ to python:

(b + (a % b)) % b
夏末 2024-12-14 07:28:51

在这种情况下(即当一个或两个操作数为负时)的符号是实现定义的。该规范在 §5.6/4 (C++03) 中表示,

二元 / 运算符产生商,二元 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义;否则 (a/b)*b + a%b 等于 a。如果两个操作数都非负,则余数也非负; 如果不是,则余数的符号是​​实现定义的

就 C++03 而言,这就是该语言必须说的全部内容。

The sign in such cases (i.e when one or both operands are negative) is implementation-defined. The spec says in §5.6/4 (C++03),

The binary / operator yields the quotient, and the binary % operator yields the remainder from the division of the first expression by the second. If the second operand of / or % is zero the behavior is undefined; otherwise (a/b)*b + a%b is equal to a. If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined.

That is all the language has to say, as far as C++03 is concerned.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文