2015-05-28 5 views
8

सी # में विभिन्न मूल्य प्रकार हैं, और प्रत्येक अपना स्वयं का उद्देश्य प्रदान करता है। Int32 - (0x7FFFFFFF + 1) से 0x7FFFFFFF तक है, और प्रत्येक मशीन से मैंने इसे कभी भी चलाया है, ऐसा लगता है कि अनचेक ((int) 0xFFFFFFFF) हमेशा मुझे परिणामस्वरूप मान -1 प्राप्त करता है। क्या यह हमेशा मामला है? इसके अलावा, क्या .NET हमेशा किसी भी सिस्टम पर स्मृति में 0xFFFFFFFF के रूप में प्रतिनिधित्व करता है? क्या अग्रणी बिट हमेशा साइन बिट है? क्या यह हमेशा पूर्णांक के लिए दो के पूरक हस्ताक्षर बाइनरी प्रतिनिधित्व का उपयोग करता है?जिस तरह से सी # स्मृति में नकारात्मक पूर्णांक का प्रतिनिधित्व करता है और उन्हें अनचेक किया जाता है

उत्तर

8

System.Int32 के लिए प्रलेखन स्पष्ट रूप से बताता है कि यह दो के प्रशंसा फॉर्म में संग्रहीत है। यह बहुत ही तल पर है:

दशमलव मूल्यों के रूप में अलग-अलग पूर्णांकों के साथ काम करने के अलावा, आप पूर्णांक मूल्यों के साथ बिटवाइज़ कार्रवाई करने, या पूर्णांक मूल्यों की बाइनरी या हेक्साडेसिमल प्रतिनिधित्व के साथ काम करने के लिए कर सकते हैं। इंट 32 मान 31 बिट्स में दर्शाए जाते हैं, जिसमें तीस-बिट बिट साइन बिट के रूप में उपयोग किया जाता है। सकारात्मक मान साइन-और-आयाम प्रतिनिधित्व का उपयोग करके दर्शाए जाते हैं। नकारात्मक मान दो पूरक प्रतिनिधित्व में हैं। यह ध्यान रखना महत्वपूर्ण है कि जब आप Int32 मानों पर बिटवाईर संचालन करते हैं या जब आप व्यक्तिगत बिट्स के साथ काम करते हैं। किसी भी दो गैर-दशमलव मानों पर एक संख्यात्मक, बूलियन, या तुलना ऑपरेशन करने के लिए, दोनों मानों को उसी प्रतिनिधित्व का उपयोग करना चाहिए।

तो ऐसा लगता है कि आपके सभी प्रश्नों का उत्तर हाँ है।

इसके अलावा इंट 32 के लिए सीमा - (0x80000000) से 0x7FFFFFFFF तक है।

2

सी # - साथ ही ग्रह पर हर दूसरे 'पुटर' - 2 के पूरक नोटेशन में पूर्णांक का प्रतिनिधित्व करता है। मेरा मानना ​​है कि एक बिंदु या दूसरे पर, सीपीयू डिजाइन किए गए हैं जो अन्य प्रतिनिधित्व का उपयोग करते हैं, लेकिन इन दिनों, आप 2 भरोसेमंद नोटेशन में प्रतिनिधित्व करने वाले पूर्णांक पर भरोसेमंद निर्भर कर सकते हैं।

  • हम बाएं से दाएं बिट्स गिनती, दायीं बिट के साथ, कम से कम महत्वपूर्ण बिट और वाम-पंथी बिट इनमें सबसे महत्वपूर्ण रहा जा रहा है थोड़ा 0।

  • उच्च-आदेश (बाएं) थोड़ा सा संकेत है: 0 सकारात्मक है; 1 नकारात्मक है।

  • शेष बिट्स मूल्य लेते हैं। इसका मतलब है कि आकार एन बिट्स के पूर्णांक का वैध डोमेन है - (2 n-1) < = x < = + (2 n-1 -1)। जो कहने के लिए, एक और नकारात्मक संख्या का प्रतिनिधित्व सकारात्मक संख्या से किया जा सकता है: 16-बिट हस्ताक्षरित पूर्णांक के लिए, डोमेन -32,768 से +32,767 है।

दो के पूरक में एक नंबर में कहें आसान है:

  • द्विआधारी/आधार -2 अंकन करने के लिए अपने निरपेक्ष मान परिवर्तित करते हैं।
  • अगर मान ऋणात्मक है,
    • की विपरीत बिट्स
    • जोड़ने 1

तो, मूल्य +1 0x0001 के रूप में है, जबकि -1

के रूप में प्रस्तुत किया जाता है का प्रतिनिधित्व करती है
  • 0x0001 (बाइनरी में 1 का पूर्ण मूल्य)
  • 0xFFFE (बिट्स उलटा हुआ)
  • 0xFFFF (जोड़ने 1)

या 0xFFFF

दो के पूरक अंकन के लिए कारण यह है कि यह सीपीयू डिजाइन सरल बनाता है: के बाद से घटाव नकारात्मक के अलावा है (उदाहरण के लिए को 3-2 से 3 + -2) के रूप में ही है, वे घटाव सर्किट डिजाइन करने के लिए की जरूरत नहीं है:

  • 1-1 के रूप में 1 + -1 में ही है और शून्य करने के लिए मूल्यांकन करता है।

  • या हेक्स में,

    0x0001 (decimal +1) 
    + 0xFFFF (decimal -1) 
        ====== 
        0x0000 (decimal 0) 
    

सबसे सीपीयू पर, में या उच्च आदेश बिट के बाहर ले जाने के नियत बिन्दु अतिप्रवाह झंडा सेट।

+0

उच्च-आदेश बिट "साइन" नहीं है, जो "साइन + परिमाण" प्रतिनिधित्व होगा। दो के पूरक में, उच्च-आदेश बिट में ऋणात्मक स्थान मान होता है (अगले बिट के बराबर 2 गुना मूल्य, इसलिए यह 2 की शक्ति है) –

संबंधित मुद्दे