跳至內容

模除

維基百科,自由的百科全書
  商數 () 和   餘數 () 作為被除數 () 的函數時的圖像。左側是除數為正的情況,右側除數為負。從上至下分別使用了:向零取整、向下取整和歐幾里得除法

模除(英語:modulo 有時也稱作 modulus),又稱模數取模取模運算等,它得出一個數除以另一個數的餘數。給定兩個正數:被除數除數(通常縮寫為),得到的是使用歐幾里得除法時的餘數所得之數被稱為小數部份。

舉個例子:計算表達式得到,因為的商為而餘數為;而得到,因為的商為而餘數為;做除法不能整除時得到是有理數,平常使用的計算器採用了有限數位十進制表示法,它以小數點分隔整數部份和小數部份,比如

雖然通常情況下模除的被除數和除數都是整數,但許多計算系統允許其他類型的數值運算,比如對浮點數取模。在所有計算系統中當被除數和除數都是正數時,結果的餘數的範圍為;而經常是未定義的,在編程語言裡可能會導致除以零錯誤。當被除數或除數為負數時,不同的編程語言對結果有不同的處理。

各種定義

在數學中,取模運算的結果就是歐幾里德除法餘數。當然也有許多其他的定義方式。計算機和計算器有許多種表示和儲存數字的方法,因此在不同的硬件環境下、不同的編程語言中,取模運算有着不同的定義。

幾乎所有的計算系統中,除以得到商和餘數均滿足以下式子:

1

即使如此,當餘數時,餘數的符號仍然是有歧義的:餘數非時,它的符號有兩種選擇,一個是正號而另一個是負號[a]。通常情況下,在數論中總是選擇正餘數。但在編程中,選擇餘數的符號依賴於編程語言和被除數或除數的符號。在編程語言所定義的整數模除中,ISO/IEC標準Pascal[1]ALGOL 68[2],在計算出的餘數r為負數時,返回正數作為結果[b];另一些編程語言如ISO/IEC C90,當被除數或除數是負數時,C90標準並沒有做具體的規定,而是留給編譯器去定義並實現[3]。在大多數系統中是未定義的,雖然有些系統定義它就等於。更多詳情參見後續章節表格。

  • 很多取模的實現都使用了「截斷除法」(英語:truncated division),商經由截尾函數來定義,商向零取整,結果等於普通除法所得的小數靠近方向的第一個整數:

    餘數和被除數符號一致:

  • 高德納定義的「下取整除法」(英語:floored division[4],商經由下取整函數來定義,商總是向負無窮取整,即使商已經是負數:

    餘數和除數符號一致:

  • Raymond T. Boute使用的歐幾里得除法定義中[5],要求滿足,在這種情況下:

    這裡的符號函數,餘數總是非負數:

  • Common Lisp的round函數和IEEE 754英語IEEE 754-1985使用「修約除法」(英語:rounded division),商經由修約函數約半成偶)來定義為:

    當商為偶數時,餘數範圍是;當商為奇數時,餘數範圍是

  • Common Lisp的ceiling函數使用「上取整除法」(英語:ceiling division),商經由上取整函數定義為:

    餘數與除數有相反的符號:

記號

一些計算器有取模mod()按鈕,很多編程語言裡也有類似的函數,通常像mod(a, n)這樣。有些語言也支持在表達式內使用%modMod作為取模或取余操作符,比如a % na mod n

在一些沒有mod()函數的環境中或許可使用等價的:a - (n * int(a/n))。這裡的int()函數事實上等價於截斷函數。

性質及恆等式

一些取模操作,經過分解和展開可以等同於其他數學運算。這在密碼學的證明中十分有用,例如:迪菲-赫爾曼密鑰交換

  • 恆等式:
    • 對所有的正數 有:
    • 如果 是一個質數,且不為 因數,此時由費馬小定理有:
  • 逆運算:
    • .
    • 表示模反元素。當且僅當 互質時,等式左側有定義:
  • 分配律:
  • 除法定義:僅當式子右側有定義時,即 互質時有:,其他情況為未定義的。
  • 乘法逆元:.

編程語言實現

在各種編程語言中的模除運算
語言 算符 整數 浮點數 定義
ABAP MOD 歐幾里得式
ActionScript % 截斷
Ada mod 下取整[6]
rem 截斷[6]
ALGOL 68 ÷×, mod 類似歐幾里得式[c]
AMPL mod 截斷
APL |[d] 下取整
AppleScript mod 截斷
AutoLISP (rem d n) 截斷
AWK % 截斷
bash % 截斷
BASIC Mod 實現各異
bc % 截斷
C
C++
%, div 截斷[e]
fmod (C)
std::fmod (C++)
截斷[9]
remainder (C)
std::remainder (C++)
修約
C# % 截斷
Math.IEEERemainder 修約[10]
Clarion英語Clarion (programming language) % 截斷
Clean rem 截斷
Clojure mod 下取整[11]
rem 截斷[12]
COBOL FUNCTION MOD 下取整[13]
FUNCTION REM 截斷[13]
CoffeeScript % 截斷
%% 下取整[14]
ColdFusion %, MOD 截斷
Common Intermediate Language rem (有符號) 截斷[15]
rem.un (無符號) 不適用
Common Lisp mod 下取整
rem 截斷
Crystal英語Crystal (programming language) %, modulo 下取整
remainder 截斷
D % 截斷[16]
Dart % 歐幾里得式[17]
remainder() 截斷[18]
Eiffel \\ 截斷
Elixir rem/2 截斷[19]
Integer.mod/2 下取整[20]
Elm modBy 下取整[21]
remainderBy 截斷[22]
Erlang rem 截斷
math:fmod/2 截斷 (同於C)[23]
Euphoria mod 下取整
remainder 截斷
F# % 截斷
Math.IEEERemainder 修約[10]
Factor mod 截斷
FileMaker Mod 下取整
Forth mod 實現定義
fm/mod 下取整
sm/rem 截斷
Fortran mod 截斷
modulo 下取整
Frink英語Frink (programming language) mod 下取整
Full BASIC英語Full BASIC MOD 下取整[24]
REMAINDER 截斷[25]
GLSL % 未定義[26]
mod 下取整[27]
GameMaker Studio (GML) mod, % 截斷
GDScript (Godot) % 截斷
fmod 截斷
posmod 歐幾里得式
fposmod 歐幾里得式
Go % 截斷[28]
math.Mod 截斷[29]
big.Int.Mod 歐幾里得式[30]
big.Int.Rem 截斷[31]
Groovy % 截斷
Haskell mod 下取整[32]
rem 截斷[32]
Data.Fixed.mod' (GHC) 下取整
Haxe % 截斷
HLSL % 未定義[33]
J |[d] 下取整
Java % 截斷
Math.floorMod 下取整
JavaScript
TypeScript
% 截斷
Julia mod 下取整[34]
%, rem 截斷[35]
Kotlin %, rem 截斷[36]
mod 下取整[37]
ksh % 截斷 (同於POSIX sh)
fmod 截斷
LabVIEW mod 截斷
LibreOffice =MOD() 下取整
Logo MODULO 下取整
REMAINDER 截斷
Lua 5 % 下取整
Lua 4 mod(x,y) 截斷
Liberty BASIC英語Liberty BASIC MOD 截斷
Mathcad mod(x,y) 下取整
Maple e mod m (默認), modp(e, m) 歐幾里得式
mods(e, m) 修約
frem(e, m) 修約
Mathematica Mod[a, b] 下取整
MATLAB mod 下取整
rem 截斷
Maxima mod 下取整
remainder 截斷
Maya Embedded Language英語Maya Embedded Language % 截斷
Microsoft Excel =MOD() 下取整
Minitab MOD 下取整
Modula-2 MOD 下取整
REM 截斷
MUMPS英語MUMPS # 下取整
Netwide Assembler (NASM, NASMX) %, div (無符號) 不適用
%% (有符號) 實現定義[38]
Nim mod 截斷
Oberon MOD 類似下取整[f]
Objective-C % 截斷 (同於C99)
Object Pascal, Delphi mod 截斷
OCaml mod 截斷[39]
mod_float 截斷[40]
Occam \ 截斷
Pascal (ISO-7185和ISO-10206) mod 類似歐幾里得式[c]
Perl % 下取整[g]
POSIX::fmod 截斷
PHP % 截斷[42]
fmod 截斷[43]
PIC BASIC Pro \\ 截斷
PL/I mod 下取整 (ANSI PL/I)
PowerShell % 截斷
Programming Code (PRC英語PRC (Palm OS)) MATH.OP - 'MOD; (\)' 未定義
Progress英語OpenEdge Advanced Business Language modulo 截斷
Prolog (ISO 1995[44]) mod 下取整
rem 截斷
PureBasic %, Mod(x,y) 截斷
PureScript `mod` 歐幾里得式[45]
Pure Data % 截斷 (同於C)
mod 下取整
Python % 下取整
math.fmod 截斷
math.remainder 修約
Q# % 截斷[46]
R %% 下取整[47]
Racket modulo 下取整
remainder 截斷
Raku % 下取整
RealBasic英語RealBasic MOD 截斷
Reason mod 截斷
Rexx // 截斷
RPG英語IBM RPG %REM 截斷
Ruby %, modulo() 下取整
remainder() 截斷
Rust % 截斷
rem_euclid() 歐幾里得式[48]
SAS MOD 截斷
Scala % 截斷
Scheme modulo 下取整
remainder 截斷
Scheme R6RS mod 歐幾里得式[49]
mod0 修約[49]
flmod 歐幾里得式
flmod0 修約
Scratch mod 下取整
Seed7英語Seed7 mod 下取整
rem 截斷
SenseTalk英語SenseTalk modulo 下取整
rem 截斷
Unix shell (包括bash、ash等。) % 截斷 (同於C)[50]
Smalltalk \\ 下取整
rem: 截斷
Snap! mod 下取整
Spin英語Parallax Propeller#Built in Spin byte code interpreter // 下取整
Solidity % 下取整
SQL (SQL:1999英語SQL:1999) mod(x,y) 截斷
SQL (SQL:2011英語SQL:2011) % 截斷
Standard ML mod 下取整
Int.rem 截斷
Real.rem 截斷
Stata mod(x,y) 歐幾里得式
Swift % 截斷[51]
remainder(dividingBy:) 修約[52]
truncatingRemainder(dividingBy:) 截斷[53]
Tcl % 下取整
fmod() 截斷 (同於C)
tcsh % 截斷
Torque英語Torque (game engine) % 截斷
Turing英語Turing (programming language) mod 下取整
Verilog (2001) % 截斷
VHDL mod 下取整
rem 截斷
VimL % 截斷
Visual Basic Mod 截斷
WebAssembly i32.rem_u, i64.rem_u (無符號) 不適用
i32.rem_s, i64.rem_s (有符號) 截斷[54]
x86 assembly英語x86 assembly language DIV(無符號) 不適用
IDIV(有符號) 截斷
XBase++英語XBase++ % 截斷
Mod() 下取整
Zig %, @mod, @rem 截斷[55]
Z3 theorem prover英語Z3 Theorem Prover div, mod 歐幾里得式

此外,很多計算機系統提供divmod功能,它同時產生商和餘數。例子x86架構IDIV指令,C編程語言的div()函數,和Pythondivmod()函數。

常見錯誤

當取模的結果與被除數符號相同時,可能會導致意想不到的錯誤。

舉個例子:如果需要判斷一個整數是否為奇數,有人可能會測試這個數除 2 的餘數是否為 1:

bool is_odd(int n) {
    return n % 2 == 1;
}

但在一個取模結果與被除數符號相同的編程語言裡,這樣做是錯的。因為當被除數 n 是奇數且為負數時, 得到 −1,此時函數返回「假」。

一種正確的實現是測試取模結果是否為 0,因為餘數為 0 時沒有符號的問題:

bool is_odd(int n) {
    return n % 2 != 0;
}

或者考慮餘數的符號,有兩種情況:餘數可能為 1 或 -1。

bool is_odd(int n) {
    return n % 2 == 1 || n % 2 == -1;
}

性能問題

可以通過依次計算帶餘數的除法實現取模操作。特殊情況下,如某些硬件上,存在更快的實現。 例如:2 的 n 次冪的模,可以通過逐位與運算實現:

x % 2n == x & (2n - 1)

例子,假定 x 為正數:

x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7

在進行位操作比取模操作效率更高的設備或軟件環境中,以上形式的取模運算速度更快。[56]

編譯器可以自動識別出對 2 的 n 次冪取模的表達式,自動將其優化為 expression & (constant-1)。這樣可以在兼顧效率的情況下寫出更整潔的代碼。這個優化在取模結果與被除數符號一致的語言中(包括 C 語言)不能使用,除非被除數是無符號整數。這是因為如果被除數是負數,則結果也是負數,但 expression & (constant-1) 總是正數,進行這樣的優化就會導致錯誤,無符號整數則沒有這個問題。

用途

  • 取模運算可用於判斷一個數是否能被另一個數整除。對 2 取模即可判斷整數的奇偶性;從 2 到 取模則可判斷一個數是否為質數。
  • 進制之間的轉換。
  • 用於求取最大公約數的輾轉相除法使用取模運算。
  • 密碼學中的應用:從古老的凱撒密碼到現代常用的RSA橢圓曲線密碼,它們的實現過程均使用了取模運算。

參見

腳註

  1. ^ 從數學上講,正和負只是滿足不等式的無窮多個解中的兩個。
  2. ^ ISO Pascal要求模除運算的除數n為正數。
  3. ^ 3.0 3.1 按Boute的研討,ISO Pascal和Algol68的divmod定義不能維持除法恆等式D = d · (D / d) + D % d
  4. ^ 4.0 4.1 α|ω計算,得出ω除以α的餘數。
  5. ^ C99C++11%的行為定義為截斷。[7]此前的標準將其行為留給實現定義。[8]
  6. ^ 除數必須是整數,否則未定義。
  7. ^ Perl通常使用機器無關的算術模除運算。其例子和異常,參見關於乘法運算的Perl文檔。[41]

參考文獻

  1. ^ ISO/IEC 7185, Information Technology—Programming Languages–Pascal. International Standard, 2nd ed. (PDF). ISO/IEC 7185, 1990 (E). 
    A term of the form i div j shall be an error if j is zero; otherwise, the value of i div j shall be such that
    abs(i) - abs(j) < abs((i div j) * j) <= abs(i)
    where the value shall be zero if abs(i) < abs(j); otherwise, the sign of the value shall be positive if i and j have the same sign and negative if i and j have different signs.
    A term of the form i mod j shall be an error if j is zero or negative; otherwise, the value of i mod j shall be that value of (i - (k * j)) for integral k such that 0 <= i mod j < j.
    NOTE 2 — Only for i >= 0 and j > 0 does the relation (i div j) * j + i mod j = i hold.
    Kathleen Jensen, Niklaus Wirth. PASCAL User Manual and Report - ISO Pascal Standard (PDF). 1991. 
    div   divide and truncate (i.e., value is not rounded)
    mod   modulus: let Remainder = A - (A div B) * B;
      if Remainder < 0 then A mod B = Remainder + B

      otherwise A mod B = Remainder

  2. ^ A. van Wijngaarden, B. J. Mailloux, J. E. L. Peck, C. H. A. Koster, M. Sintzoff, C. H. Lindsey, L. G. L.T. Meertens and R. G. Fisker. Revised Report on the Algorithmic Language Algol 68. IFIP W.G. 2.1. 
    10.2.3.3. Operations on integral operands
    ……
    m) OP «÷, %, OVER» = (L INT a, b) L INT:
          IF b ≠ L 0
          THEN L INT q := L 0, r := ABS a;
             WHILE (r := r - ABS b) ≥ L 0 DO q := q + L 1 OD;
             (a < L 0 AND b > L 0 OR a ≥ L 0 AND b < L 0 | -q | q)
          FI;
    n) OP «÷×, ÷*, %*, MOD» = (L INT a, b) L INT:
          (L INT r = a - a ÷ b × b; r < 0 | r + ABS b | r);
    
  3. ^ Jones, Derek M. The New C Standard: An Economic and Cultural Commentary (PDF). Addison-Wesley. 2003 [2018-07-11]. ISBN 9780201709179. (原始內容 (PDF)存檔於2018-07-11) (英語). 
    C99 reflects almost universal processor behavior (as does the Fortran Standard). This definition truncates toward zero and the expression (-(a/b) == (-a)/b) && (-(a/b) == a/(-b)) is always true. It also means that the absolute value of the result does not depend on the signs of the operands; for example:
    +10 / +3 == +3 +10 % +3 == +1 -10 / +3 == -3 -10 % +3 == -1
    +10 / -3 == -3 +10 % -3 == +1 -10 / -3 == +3 -10 % -3 == -1
    C90
    When integers are divided and the division is inexact, if both operands are positive the result of the / operator is the largest integer less than the algebraic quotient and the result of the % operator is positive. If either operand is negative, whether the result of the / operator is the largest integer less than or equal to the algebraic quotient or the smallest integer greater than or equal to the algebraic quotient is implementation-defined, as is the sign of the result of the % operator.
    If either operand is negative, the behavior may differ between C90 and C99, depending on the implementation-defined behavior of the C90 implementation.
    #include <stdio.h>
    
    int main(void)
    {
    int x = -1,
    y = +3;
    if ((x%y > 0) ||
        ((x+y)%y == x%y))
        printf("This is a C90 translator behaving differently than C99\n");
    }
    
    Quoting from the C9X Revision Proposal, WG14/N613, that proposed this change:
    The origin of this practice seems to have been a desire to map C’s division directly to the 「natural」 behavior of the target instruction set, whatever it may be, without requiring extra code overhead that might be necessary to check for special cases and enforce a particular behavior. However, the argument that Fortran programmers are unpleasantly surprised by this aspect of C and that there would be negligible impact on code efficiency was accepted by WG14, who agreed to require Fortran-like behavior in C99.
  4. ^ Knuth, Donald. E. The Art of Computer Programming. Addison-Wesley. 1972 (英語). 
    If is any real number, we write
    = the greatest integer less than or equal to (the floor of );
    = the least integer greater than or equal to (the ceiling of ).
    ……
    The following formulas and examples are easily verified:
    ……
    if and only if is an integer,
    if and only if is not an integer;
    ;   .

    ……
    If and are any real numbers, we define the following binary operation:

    ;  .  (1)

    From this definition we can see that, when ,

    .  (2)

    Consequently
    a) if , then ;
    b) if , then ;
    c) the quantity is an integral multiple of .
    We call the remainder when is divided by ; similarly, we call the quotient.
    When and are integers, 「」 is therefore a familiar operation:

    ,  ,  .  (3)

    We have if and only if is a multiple of , that is, if and only if is divisible by . The notation , read 「 divides ,」 means that is a positive integer and .
    The 「」 operation is useful also when and take arbitrary real values. For example, with trigonometric functions we can write

    .

    The quantity is the fractional part of ; we have, by Eq. (1),

    .
  5. ^ Boute, Raymond T. The Euclidean definition of the functions div and mod. ACM Transactions on Programming Languages and Systems (ACM Press (New York, NY, USA)). April 1992, 14 (2): 127–144. doi:10.1145/128861.128862 (英語). 
    Let us recall Euclid’s theorem.
    THEOREM. For any real numbers and with , there exists a unique pair of numbers satisfying the following conditions:
    (a) ;
    (b) ;
    (c) .
    For the particular case of integers, the conditions (a)-(c) correspond to part of the axioms for Euclidean rings [9].
    With the notational conventions of the theorem, we define and . Clearly the correspondingly labeled conditions are satisfied.
    Properties

    where and is as defined earlier. ()
  6. ^ 6.0 6.1 ISO/IEC 8652:2012 - Information technology — Programming languages — Ada. ISO, IEC. 2012. sec. 4.5.5 Multiplying Operators. 
  7. ^ C99 specification (ISO/IEC 9899:TC2) (PDF). sec. 6.5.5 Multiplicative operators. 2005-05-06 [16 August 2018]. 
  8. ^ ISO/IEC 14882:2003: Programming languages – C++. International Organization for Standardization (ISO), International Electrotechnical Commission (IEC). 2003. sec. 5.6.4. the binary % operator yields the remainder from the division of the first expression by the second. .... If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined 
  9. ^ ISO/IEC 9899:1990: Programming languages – C. ISO, IEC. 1990. sec. 7.5.6.4. The fmod function returns the value x - i * y, for some integer i such that, if y is nonzero, the result has the same sign as x and magnitude less than the magnitude of y. 
  10. ^ 10.0 10.1 dotnet-bot. Math.IEEERemainder(Double, Double) Method (System). Microsoft Learn. [2022-10-04] (美國英語). 
  11. ^ clojure.core - Clojure v1.10.3 API documentation. clojure.github.io. [2022-03-16]. 
  12. ^ clojure.core - Clojure v1.10.3 API documentation. clojure.github.io. [2022-03-16]. 
  13. ^ 13.0 13.1 ISO/IEC JTC 1/SC 22/WG 4. ISO/IEC 1989:2023 – Programming language COBOL需要付費訂閱. ISO. January 2023. 
  14. ^ CoffeeScript operators
  15. ^ ISO/IEC JTC 1/SC 22. ISO/IEC 23271:2012 — Information technology — Common Language Infrastructure (CLI). ISO. February 2012. §§ III.3.55–56. 
  16. ^ Expressions - D Programming Language. dlang.org. [2021-06-01]. 
  17. ^ operator % method - num class - dart:core library - Dart API. api.dart.dev. [2021-06-01]. 
  18. ^ remainder method - num class - dart:core library - Dart API. api.dart.dev. [2021-06-01]. 
  19. ^ Kernel — Elixir v1.11.3. hexdocs.pm. [2021-01-28]. 
  20. ^ Integer — Elixir v1.11.3. hexdocs.pm. [2021-01-28]. 
  21. ^ Basics - core 1.0.5. package.elm-lang.org. [2022-03-16]. 
  22. ^ Basics - core 1.0.5. package.elm-lang.org. [2022-03-16]. 
  23. ^ Erlang -- math. erlang.org. [2021-06-01]. 
  24. ^ ANSI. Programming Languages — Full BASIC. New York: American National Standards Institute. 28 January 1987. § 5.4.4. X modulo Y, i.e., X-Y*INT(X/Y). 
  25. ^ ANSI. Programming Languages — Full BASIC. New York: American National Standards Institute. 28 January 1987. § 5.4.4. The remainder function, i.e., X-Y*IP(X/Y). 
  26. ^ GLSL Language Specification, Version 4.50.7 (PDF). section 5.9 Expressions. If both operands are non-negative, then the remainder is non-negative. Results are undefined if one or both operands are negative. 
  27. ^ GLSL Language Specification, Version 4.50.7 (PDF). section 8.3 Common Functions. 
  28. ^ The Go Programming Language Specification - The Go Programming Language. go.dev. [2022-02-28]. 
  29. ^ math package - math - pkg.go.dev. pkg.go.dev. [2022-02-28]. 
  30. ^ big package - math/big - pkg.go.dev. pkg.go.dev. [2022-02-28]. 
  31. ^ big package - math/big - pkg.go.dev. pkg.go.dev. [2024-04-12]. 
  32. ^ 32.0 32.1 6 Predefined Types and Classes. www.haskell.org. [2022-05-22]. 
  33. ^ Operators. Microsoft. [2021-07-19]. The % operator is defined only in cases where either both sides are positive or both sides are negative. Unlike C, it also operates on floating-point data types, as well as integers. 
  34. ^ Mathematics · The Julia Language. docs.julialang.org. [2021-11-20]. 
  35. ^ Mathematics · The Julia Language. docs.julialang.org. [2021-11-20]. 
  36. ^ rem - Kotlin Programming Language. Kotlin. [2021-05-05] (英語). 
  37. ^ mod - Kotlin Programming Language. Kotlin. [2021-05-05] (英語). 
  38. ^ Chapter 3: The NASM Language. NASM - The Netwide Assembler version 2.15.05. 
  39. ^ OCaml library : Stdlib. ocaml.org. [2022-02-19]. 
  40. ^ OCaml library : Stdlib. ocaml.org. [2022-02-19]. 
  41. ^ Perl documentation
  42. ^ PHP: Arithmetic Operators - Manual. www.php.net. [2021-11-20]. 
  43. ^ PHP: fmod - Manual. www.php.net. [2021-11-20]. 
  44. ^ ISO 1995
  45. ^ EuclideanRing. 
  46. ^ QuantumWriter. Expressions. docs.microsoft.com. [2018-07-11] (美國英語). 
  47. ^ R: Arithmetic Operators. search.r-project.org. [2022-12-24]. 
  48. ^ F32 - Rust. 
  49. ^ 49.0 49.1 r6rs.org
  50. ^ Shell Command Language. pubs.opengroup.org. [2021-02-05]. 
  51. ^ Apple Developer Documentation. developer.apple.com. [2021-11-20]. 
  52. ^ Apple Developer Documentation. developer.apple.com. [2021-11-20]. 
  53. ^ Apple Developer Documentation. developer.apple.com. [2021-11-20]. 
  54. ^ Rossberg, Andreas (編). WebAssembly Core Specification: Version 2.0. World Wide Web Consortium. § 4.3.2 Integer Operations. 19 April 2022. 
  55. ^ Zig Documentation. Zig Programming Language. [2022-12-18]. 
  56. ^ Horvath, Adam. Faster division and modulo operation - the power of two. July 5, 2012. (原始內容存檔於2018-03-05) (英語).