《高效程序的奥秘》(Henry S.Warren,Jr.著)第9章“整数除法”中说:
除法运算是一个复杂的过程,含有除法的算法通常都不很精巧。甚至连如何定义整数除法都是一个值得研究的问题。大多数高级语言和大多数计算指令集将其定义为有理数结果的向零截取。这一定义以及其他两种可能的定义叙述如下:
--------- ---截取-- ---模--- --地板--
7 / 3 = 2 余 1 2 余 1 2 余 1
-7 / 3 = -2 余 -1 -3 余 2 -3 余 2
7 / -3 = -2 余 1 -2 余 1 -3 余 -2
-7 / -3 = 2 余 -1 3 余 2 2 余 -1
--------- --------- -------- --------
对于所有三种可能的定义,关系“被除数=商×除数+余数”都成立。在定义“模”(modulus)除法时,要求余数是非负数。在定义“地板”(floor)除法时,要求商是有理数除法的结果的“地板”。对于除数是正的情况,模除法和地板除法等价。很少使用的第四种可能定义是向最接近的整数舍入。
所以,“装配脑袋”所说的“数学上规定”实际上是指“地板”除法。而现有的高级语言(如C、C++、C#、Java、Fortran、Ada、Pascal等)大多数都使用“截取”除法,IBM的PL.8语言使用“模”除法,Knuth的MMIX计算机的除指令使用“地板”除法。
[C#语言规范 7.7.2]中说:(整数)除法将结果舍入到零,并且结果的绝对值是小于两个操作数的商的绝对值的最大可能整数。当两个操作数符号相同时,结果为零或正;当两个操作数符号相反时,结果为零或负。
posted on 2009-04-12 16:30
何克勤 阅读(589)
评论(0) 编辑 收藏 所属分类:
其他