सी/सी ++ मानक (see this link) के अनुसार, सी और सी ++ में >> ऑपरेटर हस्ताक्षरित संख्याओं के लिए एक अंकगणितीय बदलाव नहीं है। यह कंपाइलर कार्यान्वयन पर निर्भर करता है कि 0 (लॉजिकल) या साइन बिट (अंकगणितीय) को स्थानांतरित किया गया है क्योंकि बिट्स को दाईं ओर स्थानांतरित किया गया है।सत्यापित करना कि सी/सी ++ सही शिफ्ट पर हस्ताक्षर किए गए एक विशेष संकलक के लिए अंकगणित है?
क्या यह कोड हस्ताक्षर किए गए पूर्णांक के लिए लॉजिकल राइट शिफ्ट लागू करने वाले कंपाइलर्स के लिए संकलन समय पर एएसएसईआरटी (असफल) पर कार्य करेगा?
#define COMPILE_TIME_ASSERT(EXP) \
typedef int CompileTimeAssertType##__LINE__[(EXP) ? 1 : -1]
#define RIGHT_SHIFT_IS_ARITHMETIC \
((((signed int)-1)>>1) == ((signed int)-1))
// SHR must be arithmetic to use this code
COMPILE_TIME_ASSERT(RIGHT_SHIFT_IS_ARITHMETIC);
उन लोगों के लिए आपके असफल संकलन क्या हैं जिनके पास एक तार्किक बदलाव का उपयोग करने वाली मशीन है? ऐसा सॉफ़्टवेयर ऐसी मशीन/कंपाइलर पर उपयोग करने योग्य क्यों नहीं है? क्या कोड लिखना बेहतर नहीं होगा, इस पर ध्यान दिए बिना कि हस्ताक्षरित संख्या की सही शिफ्ट अंकगणित या तार्किक है या नहीं? –
मैं बिट ट्विडलिंग के माध्यम से शाखा-मुक्त चयन (बीएफएस) का उपयोग कर रहा हूं। इसे काम करने के लिए एक अंकगणितीय बदलाव की आवश्यकता है। मैं COMPILE_TIME_ASSERT (RIGHT_SHIFT_IS_ARITHMETIC) डाल रहा हूं; बीएफएस हेडर में। कोड को पारंपरिक या शाखा-मुक्त पथ चुनने के लिए RIGHT_SHIFT_IS_ARITHMETIC परिभाषित करने की आवश्यकता है। शाखा गलत तरीके से दंड के कारण यह शाखा-मुक्त कोड का उपयोग करने के लिए पीएस 3/एक्सबॉक्स 360 सीपीयू पर भारी गति से हो सकता है। – Adisak
बीटीडब्लू, संकलन समय पर असफल संकलन जहां स्पष्ट रूप से उल्लेख किया गया है, कोड को रहस्यमय रूप से असफल होने से बेहतर है ... मूल रूप से यह कहने जा रहा है कि ये दिनचर्या इस कंपाइलर (या सीपीयू) द्वारा समर्थित नहीं हैं। – Adisak