各种语言对负数取模运算结果的对比

上次学 python 的时候发现负数的取模运算结果和 PHP 的不一样,于是今天就试了一下,对比下各编程语言的差异。代码如下(这里只给出 PHP 代码,完整的其它语言的代码请点这里):

#! /usr/bin/env php
<?php

printf("%d %d %d %d\n", 9 % 4, -9 % 4, 9 % -4, -9 % -4);
printf("%d %d %d %d\n", 8 % 4, -8 % 4, 8 % -4, -8 % -4);

上面的代码很简单,第一行是不能除尽的情况,第二行是可以除尽的情况。各种语言的输出结果如下:

c -----------------------------
1, -1, 1, -1
0, 0, 0, 0

java --------------------------
1 -1 1 -1
0 0 0 0

js ----------------------------
1 -1 1 -1
0 0 0 0

php ---------------------------
1 -1 1 -1
0 0 0 0

lua ---------------------------
1	3	-3	-1
0	0	0	0

perl --------------------------
1 3 -3 -1
0 0 0 0

python ------------------------
1 3 -3 -1
0 0 0 0

rb ----------------------------
1
3
-3
-1
0
0
0
0

sh ----------------------------
1 -1 -1 1
0 0 0 0

根据输出我们可以得到下面两个结论:

  1. 能被整除的情况下,各语言都是返回零。
  2. 不能整除的情况下,C style 风格的几种语言(c,java,js,php)输出的结果一致,另外几种语言(lua,perl,python,ruby)输出的结果一样,但与 C style 的结果不一样,shell 最特殊。

PHP 手册上面明确说明:取模运算符 % 的结果和被除数的符号(正负号)相同。即 $a % $b 的结果和 $a 的符号相同。计算规则是先按被除数和除数的绝对值进行计算,然后按规定相应地符号。

Python 取模的结果符号与除数一致。Python 取模运算两个操作数一正一负的情况下比 PHP 要复杂,具体怎么算的请看这里。Python2 的负数除法也有点奇怪啊,-26 / 20 的结果不是 -1 而是 -2,完全不符合直觉啊。Python3 里面 -26  / 20 的值是 -1.3。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注