जब मैं कुलपति ++ 10 के साथ इस कोड संकलन:ऐसे जटिल कोड को दो की शक्ति द्वारा हस्ताक्षरित पूर्णांक को विभाजित करने के लिए क्यों उत्सर्जित किया जाता है?
DWORD ran = rand();
return ran/4096;
मैं इस disassembly मिलती है:
299: {
300: DWORD ran = rand();
00403940 call dword ptr [__imp__rand (4050C0h)]
301: return ran/4096;
00403946 shr eax,0Ch
302: }
00403949 ret
जो स्वच्छ और संक्षिप्त है और एक तार्किक अधिकार के साथ दो का एक शक्ति से एक प्रभाग की जगह खिसक जाना।
फिर भी जब मैं इस कोड संकलन:
299: {
300: int ran = rand();
00403940 call dword ptr [__imp__rand (4050C0h)]
301: return ran/4096;
00403946 cdq
00403947 and edx,0FFFh
0040394D add eax,edx
0040394F sar eax,0Ch
302: }
00403952 ret
है कि एक सही गणित बदलाव करने से पहले कुछ जोड़तोड़ करती है:
int ran = rand();
return ran/4096;
मैं इस disassembly मिलता है।
उन अतिरिक्त कुशलताओं की क्या आवश्यकता है? एक अंकगणित शिफ्ट पर्याप्त क्यों नहीं है?
एफडब्ल्यूआईडब्ल्यू, सी 8 9 और सी ++ 03 में यह क्रियान्वयन-परिभाषित किया गया था जिस तरह से नकारात्मक ऑपरेटरों के लिए पूर्णांक विभाजन दौर। सी 99 और सी ++ 11 में यह नहीं है। –
उसके लिए इतने सारे अपवॉट्स? –
@AlexeyFrunze यह वास्तव में बहुत अधिक चीजों की तुलना में बहुत अच्छा है जो व्यापक रूप से ऊपर उठाया जाता है। तो मैं इसे अवांछित के रूप में नहीं देखता हूं। – Mysticial