लघु उत्तर:
मानक गारंटी नहीं है कि (a/b)*b + a%b
a
के बराबर है।
सी 99 में, विभाजन /
का परिणाम शून्य की ओर छोटा कर दिया जाएगा। %
ऑपरेटर का परिणाम निश्चित होगा, इस मामले में, -1
।
सी 8 9 में, विभाजन /
का परिणाम नकारात्मक संचालन के लिए किसी भी तरह से छोटा किया जा सकता है। तो %
ऑपरेटर का परिणाम मशीन-निर्भर भी है।
लांग उत्तर:
C99 6.5.5
5/ऑपरेटर के परिणाम से दूसरे से पहले संकार्य के विभाजन से भागफल है; % ऑपरेटर का परिणाम शेष है। दोनों परिचालनों में, यदि का मान दूसरा ऑपरेंड शून्य है, तो व्यवहार अपरिभाषित है।
6 जब पूर्णांक विभाजित होते हैं, तो/ऑपरेटर का परिणाम किसी भी विभाजित भाग के साथ बीजगणितीय भाग्य होता है। यदि भाग्य ए/बी प्रतिनिधित्व योग्य है, तो अभिव्यक्ति (ए/बी) * बी + एक% बी बराबर होगी; अन्यथा, ए/बी और% बी दोनों का व्यवहार अपरिभाषित है।
और एक ही पृष्ठ पर फुटनोट व्याख्या करने के लिए कैसे /
काम करता है, यह कहते हैं:
इस बार '' शून्य की ओर काट-छांट '' कहा जाता है।
इस नियम के अनुसार, -111/11
केवल -10
हो सकता है, नहीं 1. (a/b)*b + a%b
के बाद से a
के बराबर होना चाहिए, हम -111 % 11
-1
है। ,
के लिए काट-छांट की दिशा/और% के लिए परिणाम के हस्ताक्षर मशीन निर्भर नकारात्मक ऑपरेंड के लिए कर रहे हैं के रूप में कार्रवाई पर ले लिया है:
हालांकि, कश्मीर & आर अध्याय 2.5 एक अलग जवाब देता है अतिप्रवाह या अंडरफ्लो।
इसके अनुसार, -1
या 10
एक कानूनी परिणाम हो सकता है।
कारण C89 3.3.5 में है:
पूर्णांक विभाजित हैं और विभाजन अयथार्थ है, अगर दोनों ऑपरेंड सकारात्मक रहे हैं/ऑपरेटर का परिणाम जब है सबसे बड़ा पूर्णांक बीजीय भागफल से भी कम समय और % ऑपरेटर का परिणाम सकारात्मक है। यदि ऑपरेंड नकारात्मक है, तो क्या/ऑपरेटर का परिणाम बीजगणितीय भाग से कम सबसे बड़ा पूर्णांक है या बीजगणितीय भाग से अधिक छोटा पूर्णांक कार्यान्वयन-परिभाषित है, जैसा कि% ऑपरेटर के परिणाम का संकेत है। यदि भाग्य ए/बी प्रतिनिधित्व योग्य है, अभिव्यक्ति (ए/बी) * बी + एक% बी बराबर होगी।
यह C89 से C99 में परिवर्तन के रूप में दिखाई देता है।
C99 दलील 6.5.5 कुछ ऐतिहासिक कारणों से प्रदान करता है:
C89 में, नकारात्मक ऑपरेंड एक कार्यान्वयन से परिभाषित तरीके में ऊपर या नीचे की ओर दौर सकता शामिल पूर्णांकों का विभाजन; विशेष मामलों की जांच करने और विशिष्ट व्यवहार को लागू करने के लिए रन-टाइम कोड में ओवरहेड से बचने का इरादा था। फोर्ट्रान में, परिणाम हमेशा शून्य की तरफ झुकाएगा, और उपरांत संख्यात्मक प्रोग्रामिंग समुदाय को स्वीकार्य लगता है। इसलिए, सी 99 को अब समान व्यवहार की आवश्यकता है, जो कि फोरट्रान से सी तक कोड को पोर्ट करने में सुविधा प्रदान करनी चाहिए। इस दस्तावेज़ के §7.20.6.2 में तालिका आवश्यक अर्थशास्त्र को दर्शाती है।
और यहाँ §7.20.6.2 में तालिका है:
numer denom quot rem
7 3 2 1
–7 3 –2 –1
7 –3 –2 1
–7 –3 2 –1
आह, पुराने नकारात्मक-संकार्य मापांक :-) मैं अजगर सभी विशेष मामलों में (गणितीय अर्थ में) सही यह हो रही याद। – Cameron
यदि आप सी के '%' ऑपरेटर को एक मॉड्यूलस में मजबूर करना चाहते हैं जो आपके द्वारा अपेक्षित तरीके से काम करता है, तो बस यह करें: '((%%) + b)% b' – paddy
विकिपीडिया पृष्ठ पर एक बहुत अच्छी तालिका है मॉडुलो ऑपरेशन जो दिखाता है कि प्रत्येक भाषा का अपना मॉड्यूलो कार्यान्वयन कैसे होता है: http://en.wikipedia.org/wiki/Modulo_operation –