[c++] क्या 0 और -0 के बीच अंतर करना संभव है?


Answers

एक int (लगभग सार्वभौमिक "2 के पूरक" प्रतिनिधित्व में) 0 और -0 के प्रतिनिधित्व समान हैं। (वे अन्य संख्या के प्रतिनिधित्व के लिए अलग हो सकते हैं, उदाहरण के लिए आईईईई 754 फ्लोटिंग पॉइंट।)

Question

मुझे पता है कि पूर्णांक मान 0 और -0 अनिवार्य रूप से वही हैं। लेकिन, मैं सोच रहा हूं कि उनके बीच अंतर करना संभव है या नहीं।

उदाहरण के लिए, मुझे कैसे पता चलेगा कि एक चर निर्दिष्ट किया गया था -0 ?

bool IsNegative(int num)
{
    // How ?
}

int num = -0;
int additinon = 5;

num += (IsNegative(num)) ? -addition : addition;

क्या मूल्य -0 मेमोरी में 0 समान ही सहेजा गया है?




सी ++ भाषा विनिर्देश में, नकारात्मक शून्य के रूप में ऐसा कोई int नहीं है

उन दोनों शब्दों का एकमात्र अर्थ यूनरी ऑपरेटर है - 0 लागू होता है, जैसे कि तीन प्लस पांच केवल द्विआधारी ऑपरेटर + 3 और 5 लागू होता है।

यदि कोई अलग नकारात्मक शून्य था , तो दो पूरक (पूर्णांक प्रकारों का सबसे आम प्रतिनिधित्व) सी ++ कार्यान्वयन के लिए अपर्याप्त प्रतिनिधित्व होगा, क्योंकि शून्य के दो रूपों का प्रतिनिधित्व करने का कोई तरीका नहीं है।

इसके विपरीत, फ्लोटिंग पॉइंट्स (आईईईई के बाद) में अलग सकारात्मक और नकारात्मक शून्य होते हैं। उन्हें प्रतिष्ठित किया जा सकता है, उदाहरण के लिए, जब उनके द्वारा 1 को विभाजित किया जाता है। सकारात्मक शून्य सकारात्मक अनंत पैदा करता है; नकारात्मक शून्य नकारात्मक अनंतता पैदा करता है।

हालांकि, अगर int 0 (या किसी भी int, या किसी अन्य प्रकार के किसी अन्य मूल्य) के विभिन्न स्मृति प्रस्तुतियां होती हैं, तो आप यह memcmp लिए memcmp का उपयोग कर सकते हैं:

#include <string>

int main() {
    int a = ...
    int b = ...
    if (memcmp(&a, &b, sizeof(int))) {
        // a and b have different representations in memory
    }
}

बेशक, अगर ऐसा होता है, प्रत्यक्ष स्मृति संचालन के बाहर, दो मान अभी भी वैसे ही काम करेंगे।




मैंने इस जवाब को छोड़ने का फैसला किया है क्योंकि सी और सी ++ कार्यान्वयन आमतौर पर निकटता से संबंधित होते हैं, लेकिन असल में यह सी मानक को रोकता नहीं है जैसा मैंने सोचा था। मुद्दा यह है कि सी ++ मानक निर्दिष्ट नहीं करता है कि इन मामलों के मामलों के साथ क्या होता है। यह भी प्रासंगिक है कि वास्तविक दुनिया में गैर-जुड़वां-पूरक प्रतिनिधित्व बहुत दुर्लभ हैं, और यहां तक ​​कि जहां वे मौजूद हैं, वे अक्सर इसे प्रकट करने के बजाय कई मामलों में अंतर छुपाते हैं क्योंकि कोई आसानी से खोज सकता है।

पूर्णांक प्रतिनिधित्व में ऋणात्मक शून्य का व्यवहार जिसमें वे मौजूद हैं, सी ++ मानक में कठोर रूप से परिभाषित नहीं है क्योंकि यह सी मानक में है। हालांकि, यह सी स्तर (आईएसओ / आईईसी 98 99: 1 999) को शीर्ष स्तर पर मानक संदर्भ के रूप में उद्धृत करता है [1.2]।

सी मानक [6.2.6.2] में, ऋणात्मक शून्य केवल बिटवाईर संचालन का परिणाम हो सकता है, या संचालन जहां नकारात्मक शून्य पहले से मौजूद है (उदाहरण के लिए, किसी मान द्वारा नकारात्मक शून्य को गुणा या विभाजित करना, या ऋणात्मक शून्य जोड़ना शून्य) - सामान्य शून्य के मान पर यूनरी माइनस ऑपरेटर को लागू करना, जैसा कि आपके उदाहरण में है, इसलिए सामान्य शून्य में परिणामस्वरूप गारंटी दी जाती है।

यहां तक ​​कि उन मामलों में जो ऋणात्मक शून्य उत्पन्न कर सकते हैं, वहां कोई गारंटी नहीं है कि वे एक प्रणाली पर भी नकारात्मक शून्य का समर्थन करेंगे:

यह अनिर्दिष्ट है कि क्या ये मामले वास्तव में ऋणात्मक शून्य या सामान्य शून्य उत्पन्न करते हैं, और किसी ऑब्जेक्ट में संग्रहीत होने पर ऋणात्मक शून्य सामान्य शून्य हो जाता है या नहीं।

इसलिए, हम निष्कर्ष निकाल सकते हैं: नहीं, इस मामले का पता लगाने का कोई विश्वसनीय तरीका नहीं है। यहां तक ​​कि अगर इस तथ्य के लिए नहीं कि आधुनिक कंप्यूटर सिस्टम में गैर-जुड़वां-पूरक प्रतिनिधित्व बहुत असामान्य हैं।

सी ++ मानक, इसके हिस्से के लिए, "ऋणात्मक शून्य" शब्द का कोई जिक्र नहीं करता है, और नोट किए गए [3.9.1 पैरा 7] को ध्यान में रखते हुए, हस्ताक्षरित परिमाण और किसी के पूरक प्रतिनिधित्व के विवरणों की बहुत कम चर्चा है।




Related