2011-12-03 10 views
5
#include <iostream> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 

    int num=-2147483648; 
    int positivenum=-num; 
    int absval=abs(num); 

    std::cout<<positivenum<<"\n"; 
    std::cout<<absval<<"\n"; 

    return 0; 
} 

हाय मैं काफी उत्सुक हूँ क्यों उपरोक्त कोड के उत्पादन मेंसी/सी ++ में -2147483648 की नकारात्मकता संभव नहीं है?

-2147483648 
-2147483648 

अब मुझे पता है कि -2147483648 पर हस्ताक्षर किए ints सबसे छोटे represntable संख्या, (यह मानते हुए एक int 32 बिट है) है। मैं मानता था कि हम इस नंबर से नीचे जाने के बाद ही कचरा जवाब प्राप्त करेंगे। लेकिन इस मामले में, +2147483648 पूर्णांक के 32 बिट सिस्टम द्वारा कवर किया गया है। तो दोनों मामलों में नकारात्मक जवाब क्यों?

+0

int के बजाय _int64 का उपयोग करें और पुनः प्रयास करें। – jmucchiello

उत्तर

15

लेकिन इस मामले में, +2147483648 पूर्णांक के 32 बिट सिस्टम द्वारा कवर किया गया है।

बिल्कुल सही नहीं है। यह केवल +2147483647 तक जाता है। तो आपकी धारणा सही नहीं है।

-2147483648 नकारात्मक 2147483648 का उत्पादन करेगा, लेकिन यह -2147483648 पर वापस आ जाएगा।

इसके अलावा, हस्ताक्षर पूर्णांक अतिप्रवाह तकनीकी रूप से अपरिभाषित व्यवहार है।

7

मूल्य - (- 2147483648) 32-बिट हस्ताक्षरित int में संभव है। हस्ताक्षरित 32-बिट int की श्रेणी -2147483648 2147483647

+0

डर्न मैं जवाब देने जा रहा था, लेकिन +1 – tekknolagi

2

आह, लेकिन इसकी नहीं ... 0 याद है, सबसे बड़ा हस्ताक्षर किए वास्तव में है 2147483647

1

चूंकि प्रवेश पूर्णांक 2 के पूरक प्रतिनिधित्व सममित नहीं है और कम से कम 32-बिट पर हस्ताक्षर किए पूर्णांक जबकि अधिकतम -2147483648 है +2147483647 है। यह -2147483648 अपने स्वयं के समकक्ष जैसा है 0 है (2 के पूरक प्रतिनिधित्व में केवल एक 0 है, कोई अलग +0 और -0 नहीं है)।

यहां कुछ स्पष्टीकरण दिया गया है।

एन-बिट 2 के पूरक के रूप में प्रतिनिधित्व करते समय एक ऋणात्मक संख्या -X प्रभावी ढंग से असाइन किए गए नंबर के रूप में दर्शाया जाता है जो 2 एन -X के बराबर है। तो, 32-बिट पूर्णांकों के लिए:
यदि x = 1, तो -X = 2 - 1 = 4294967295
अगर एक्स = 2147483647, तो -X = 2 - यदि 2147483647 = २१४७४८३६४९
एक्स = 2147483648, तो -X = 2 - 2147483648 = 2147483648
अगर एक्स = -+२१४७४८३६४८, तो -X = 2 + 2147483648 = 2147483648 (क्योंकि हम केवल कम 32 बिट रखने के लिए)

तो, -2147483648 = +2147483648। 2 के पूरक मूल्यों की दुनिया में आपका स्वागत है।

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