數學:如果您有這樣的方程式:x = 3 mod 7x可以是... -4、3、10、17 ...或更一般地:x = 3 + k * 7其中k可以是任何整數。我不知道為數學定義了模運算,但是因子環當然是。Python:在Python中,%與正數一起使用時,您總是會得到非負值m:#!/usr/bin/python# -*- coding: utf-8 -*-m = 7for i in xrange(-8, 10 + 1): print(i % 7)結果是:6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3C ++:#include <iostream>using namespace std;int main(){ int m = 7; for(int i=-8; i <= 10; i++) { cout << (i % m) << endl; } return 0;}將輸出:-1 0 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 0 1 2 3 ISO / IEC 14882:2003(E)-5.6乘法運算符:二進制/操作員產生的商,和二進制%操作者產生了由第二所述第一表達的除法的余數。如果/或%的第二個操作數為零,則行為不確定。否則(a / b)* b + a%b等于a。如果兩個操作數均為非負數,則其余為非負數;如果不是,則其余的符號由實現定義74)。和74)根據對ISO C進行修訂的工作,整數除法的首選算法遵循ISO Fortran標準ISO / IEC 1539:1991中定義的規則,其中商總是四舍五入。資料來源:ISO / IEC 14882:2003(E)(我找不到的免費版本ISO/IEC 1539:1991。有人知道從何處獲得它嗎?)該操作似乎是這樣定義的:在此處輸入圖片說明問題:這樣定義它是否有意義?此規范的參數是什么?制定這樣的標準的人是否有討論的地方?在哪里可以閱讀有關他們決定采用這種方式的原因的一些信息?在大多數情況下,當我使用模數時,我想訪問數據結構的元素。在這種情況下,我必須確保mod返回一個非負值。因此,對于這種情況,最好始終將mod返回非負值。(另一種用法是歐幾里得算法。由于在使用此算法之前可以使兩個數字均為正數,所以取模的符號很重要。)附加材料:有關不同語言的模運算的詳細列表,請參見Wikipedia。
3 回答

米琪卡哇伊
TA貢獻1998條經驗 獲得超6個贊
在x86(和其他處理器體系結構)上,整數除法和模是通過單個操作idiv
(div
對于無符號值)執行的,該操作會產生商和余數(分別針對in AX
和in的字長參數DX
)。C庫函數中使用了該函數divmod
,編譯器可以將其優化為單個指令!
整數除法遵守兩個規則:
非整數商將舍入為零;和
dividend = quotient*divisor + remainder
結果滿足了方程式。
因此,當將負數除以正數時,商將為負(或零)。
因此,這種行為可以看作是一系列本地決策的結果:
處理器指令集設計針對較普通情況(模)優化了普通情況(除法);
一致性(四舍五入并遵守除法方程)比數學正確性更可?。?/p>
C更喜歡效率并且要簡單(特別是傾向于將C視為“高級匯編程序”);和
C ++更喜歡與C兼容。

Smart貓小萌
TA貢獻1911條經驗 獲得超7個贊
此規范的參數是什么?
C ++的設計目標之一是有效地映射到硬件。如果底層硬件以產生負余數的方式實現除法,那么這就是%在C ++中使用時得到的結果。真的就是全部。
制定這樣的標準的人是否有討論的地方?
您將在comp.lang.c ++。moderated上找到有趣的討論,并在較小程度上找到comp.lang.c ++
- 3 回答
- 0 關注
- 749 瀏覽
添加回答
舉報
0/150
提交
取消