2008-11-25 12 views
8

जावा में एक पूर्णांक का अधिकतम मान 2147483647 है, क्योंकि जावा पूर्णांक हस्ताक्षरित हैं, है ना?जावा एक int के रूप में 0xff000000 स्टोर करने में सक्षम क्यों है?

0xff000000 4278190080.

की एक अंकीय मान है फिर भी मैं इस तरह जावा कोड देखें:

int ALPHA_MASK = 0xff000000; 

किसी को भी मुझे प्रबुद्ध कर सकते हैं?

उत्तर

25

उच्च बिट एक संकेत बिट है। इसे सेट करना ऋणात्मक संख्या दर्शाता है: -16777216।

जावा, अधिकांश भाषाओं की तरह, 2's complement रूप में हस्ताक्षर किए गए नंबर स्टोर करता है। इस मामले में, 2 , या 21x7483648 0x7F000000, या 2130706432 से घटाना, -16777216 उत्पन्न करता है।

1

अतिरिक्त बिट हस्ताक्षर के लिए है

जावा ints हैं twos complement

0

इनट्स जावा में साइन इन हैं।

39

बस एरिक्सन का जवाब देने के लिए एक अतिरिक्त:

के रूप में उन्होंने कहा, पर हस्ताक्षर किए पूर्णांक अधिकांश कंप्यूटर आर्किटेक्चर पर अपने-अपने सकारात्मक मूल्य के लिए दो के पूरक के रूप में जमा हो जाती है।

है यही कारण है कि, पूरे 2^32 संभावित मान दो सेट में विभाजित किया गया है: एक 1.

अब के साथ शुरू 0-बिट के साथ शुरू सकारात्मक मूल्यों के लिए एक और ऋणात्मक मानों के लिए एक, कल्पना है कि हम '3-बिट संख्या तक सीमित है। हम उन्हें एक दूसरे में मतलब होगा कि एक अजीब तरह से व्यवस्था:

 000 
    111 001 
110  010 
    101 011 
    100 

आप देखते हैं कि बाएं हाथ की ओर पर सभी नंबरों को एक 1-बिट के साथ शुरू जबकि दाएँ हाथ की ओर पर वे के साथ शुरू 0. 0. पूर्व को नकारात्मक और उत्तरार्द्ध के रूप में घोषित करने के हमारे पहले के निर्णय से, हम देखते हैं कि 001, 010 और 011 एकमात्र संभावित सकारात्मक संख्या हैं जबकि 111, 110 और 101 उनके संबंधित नकारात्मक समकक्ष हैं।

अब हम क्रमशः शीर्ष और निचले स्तर पर मौजूद दो संख्याओं के साथ क्या करते हैं? 000 शून्य होना चाहिए, जाहिर है, और 100 उन सभी की सबसे कम नकारात्मक संख्या होगी जिनके पास सकारात्मक समकक्ष नहीं है। संक्षेप में:

 000  (0) 
    111 001 (-1/1) 
110  010 (-2/2) 
    101 011 (-3/3) 
    100  (-4) 

आप देख सकते हैं कि आप 1 (001) को नकारने और 1 (001) को जोड़ने के लिए यह द्वारा -1 (111) के बिट पैटर्न प्राप्त कर सकते हैं: 001 (= 1) -> 110 + 001 -> 111 (= -1)

अपने प्रश्न के लिए वापस आ रहा है:

0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000

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

इसका मतलब यह है, हम

के दो के पूरक ले लेंगे
1111 1111 0000 0000 0000 0000 0000 0000 

जो

0000 0000 1111 1111 1111 1111 1111 1111 

है तो हम जोड़ने

0000 0000 0000 0000 0000 0000 0000 0001 

और

0000 0001 0000 0000 0000 0000 0000 0000 = 16777216 

इसलिए, 0xff000000 = -16777216 प्राप्त करें।

+0

@ किट्स्यून (और/या कोई भी जो पहले से ही यह नहीं जानता है): यह एक अच्छी व्याख्या है। इसे पढ़ने में कुछ समय लग सकता है लेकिन मैं आपको इसे पढ़ने के लिए अनुशंसा करता हूं जब तक कि यह वास्तव में समझ में न आए। –

7

कुछ बिंदुओं को इंगित करने के लायक है - यह कोड एक संख्यात्मक मान के साथ एक पूर्णांक के रूप में उपयोग करने के लिए नहीं है; 32 बिट रंग मान से अल्फा चैनल फ़िल्टर करने के लिए उद्देश्य बिटमैस्क के रूप में है। इस चर को वास्तव में एक संख्या के रूप में भी नहीं सोचा जाना चाहिए, जैसे उच्च 8 बिट्स के साथ एक बाइनरी मास्क चालू है।

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