模除(又称模数、取模操作、取模运算等,英语:modulo 有时也称作 modulus)得到的是一个数除以另一个数的余数。
给定两个正整数:被除数 和除数 , modulo (缩写为 mod )得到的是使用欧几里德除法时 / 的余数。举个例子:计算表达式 "5 mod 2" 得到 1,因为 5÷2=2...1(5 除以 2 商 2 余1);而 "9 mod 3" 得到 0,因为 9÷3=3...0;注意:如果使用计算器做除法,不能整除时,你不会得到商,而是会得到一个小数,如:5÷2=2.5。
虽然通常情况下 和 都是整数,但许多计算系统允许其他类型的数字操作,如:对浮点数取模。一个整数对 取模的结果范围为: 0 到 − 1( mod 1 恒等于 0; mod 0 则是未定义的,在编程语言里可能会导致除零错误)。有关概念在数论中的应用请参阅模算数。
当 和 均为负数时,通常的定义就不适用了,不同的编程语言对结果有不同的处理。
在数学中,取模运算的结果就是欧几里德除法的余数。当然也有许多其他的定义方式。计算机和计算器有许多种表示和储存数字的方法,因此在不同的硬件环境下、不同的编程语言中,取模运算有着不同的定义。
几乎所有的计算系统中, 除 得到商 和余数 均满足以下式子:
或除数 的符号。标准 Pascal 和 ALGOL 68 总是使用 0 或正余数;另一些编程语言,如 C90 ,当除数 和除数 都是负数时,C90 标准并没有做具体的规定,而是留给编译器去定义并实现。在大多数系统上 mod 0 时未定义的,虽然有些系统定义它就等于 。更多详情参见表格。
因此由等式 1 有,余数。因为使用了取底函数,商总是向下取整,即使商已经是负数。
在这种情况下:
或者等价的:
这里的 sgn 是符号函数,因此
当取模的结果与被除数符号相同时,可能会导致意想不到的错误。
举个例子:如果需要判断一个整数是否为奇数,有人可能会测试这个数除 2 的余数是否为 1:
bool is_odd(int n) { return n % 2 == 1;}