दिलचस्प पोस्ट
InflateException: बाइनरी एक्सएमएल फ़ाइल लाइन # 1: क्लाउड बढ़ाने में त्रुटि <अज्ञात> OutOfMemoryError के कारण "X / i $ pc" के साथ GDB में 16-बिट x86 बूट सेक्टर कोड को कैसे अलग करना है? इसे 32-बिट के रूप में माना जाता है जावास्क्रिप्ट में नामित पैरामीटर ब्लैकबेरी यूजर इंटरफेस डिजाइन – अनुकूलन यूआई? जेनरिक और कास्टिंग – मूल वर्ग को विरासत में मिली कक्षा नहीं डाल सकती UIView में पारदर्शी छेद कट कैसे पता चलेगा कि दो इमोजी एक इमोजी के रूप में प्रदर्शित किए जाएंगे? जावा में सूची के लिए मानचित्र को कैसे रूपांतरित करना है? क्लासनोटफ़ाउंड एक्स्प्लेशन / नोक्लास डीफफाउंड त्रुटि मेरे जावा वेब अनुप्रयोग में स्ट्रिंग :: c_str () अब सी + + 11 में समाप्त नहीं है? आईओएस अद्वितीय उपयोगकर्ता पहचानकर्ता अप्रयुक्त कोड ढूंढें चेतावनी और php / mysql पर त्रुटियों को बंद करें MKAnnotationView कॉलआउट को अनुकूलित करें आज के साथ दी गई दिनांक की तुलना करें

Java में बिट स्तर पर इंटिजर्स आंतरिक रूप से कैसे प्रतिनिधित्व किया जाता है?

मैं यह समझने की कोशिश कर रहा हूं कि कैसे जावा भंडार आंतरिक रूप से आंतरिक रूप से मुझे पता है कि सभी जावा आदिम पूर्णांक पर हस्ताक्षर किए गए हैं, (छोटा छोड़कर?)। इसका मतलब है कि संख्या के लिए एक बाइट में एक कम बिट उपलब्ध है।

मेरा प्रश्न यह है कि क्या सभी पूर्णांक (सकारात्मक और नकारात्मक) दो पूरक के रूप में जमा किए जाते हैं या दो पूरक में केवल ऋणात्मक संख्याएं हैं?

मैं देखता हूं कि चश्मा x bit two's complement number कहते हैं। लेकिन मुझे अक्सर उलझन में मिलता है।

उदाहरण के लिए:

  int x = 15; // Stored as binary as is? 00000000 00000000 00000000 00001111? int y = -22; // Stored as two complemented value? 11111111 11111111 11111111 11101010 

संपादित करें

स्पष्ट होने के लिए, x = 15

  In binary as is: `00000000 00000000 00000000 00001111' Two's complement: `11111111 11111111 11111111 11110001` 

इसलिए यदि आपका उत्तर all नंबरों को दो पूरक के रूप में जमा किया जाता है:

  int x = 15; // 11111111 11111111 11111111 11110001 int y = -22 // 11111111 11111111 11111111 11101010 

यहाँ फिर से भ्रम का संकेत है, ये दोनों नकारात्मक संख्या हैं। हो सकता है मैं इसे गलत तरीके से गलत समझ रहा हूँ?

संपादित करें मुझे यकीन नहीं है कि मेरा प्रश्न भ्रमित है। सवाल अलग करने के लिए मजबूर:

मेरा प्रश्न ठीक है: क्या सकारात्मक नंबर binary as is में संग्रहित है binary as is नकारात्मक संख्या two's complement रूप में जमा की जाती है?

कुछ ने कहा कि सभी को दो पूरक में रखा गया है और एक उत्तर में कहा गया है कि केवल नकारात्मक संख्या दो पूरक हैं।

वेब के समाधान से एकत्रित समाधान "Java में बिट स्तर पर इंटिजर्स आंतरिक रूप से कैसे प्रतिनिधित्व किया जाता है?"

जावा आदिम डेटा प्रकारों को संक्षेप में प्रस्तुत करते हैं:

बाइट : बाइट डेटा प्रकार एक 8-बिट पर हस्ताक्षर किए गए दो पूरक पूर्णांक

संक्षिप्त : लघु डेटा प्रकार एक 16-बिट दो पूरक का पूर्णांक है

int: इंट डेटा टाइप एक 32-बिट पर हस्ताक्षर किए दो के पूरक पूर्णांक

लंबे: लंबी डेटा प्रकार एक 64-बिट पर हस्ताक्षर किए दो के पूरक पूर्णांक

फ्लोट: फ्लोट डेटा टाइप एक एकल-सटीक 32-बिट आईईईई 754 फ्लोटिंग प्वाइंट है I

डबल : डबल डेटा प्रकार एक डबल-सटीक 64-बिट आईईईई 754 फ्लोटिंग प्वाइंट है I

बूलियन: बूलियन डेटा प्रकार सूचना का एक बिट का प्रतिनिधित्व करता है

चार: चार डेटा प्रकार एक 16-बिट यूनिकोड वर्ण है

स्रोत

दो का अनुपूरण

"अच्छा उदाहरण विकी से है कि 256 = 255 + 1, और (255 – x) को ध्यान में रखते हुए दो पूरक के संबंध में एहसास होता है 'x के पूरक

0000 0111 = 7 दो पूरक हैं 1111 1001 = -7

जिस तरह से यह काम करता है वह है एमएसबी (सबसे महत्वपूर्ण बिट) एक नकारात्मक मान प्राप्त करता है ताकि ऊपर के मामले में

-7 = 1001 = -8 + 0+ 0+ 1

सकारात्मक पूर्णांक आमतौर पर साधारण द्विआधारी संख्या के रूप में संग्रहित होते हैं (1 1, 10 2, 11 3 और इसी प्रकार है)।

नकारात्मक पूर्णांक दो पूर्ण गुणों के पूरक के रूप में जमा किए जाते हैं। इस संकेतन का उपयोग करते समय, दो अंकों की एक सकारात्मक संख्या, एक नकारात्मक संख्या है।

स्रोत

चूंकि मुझे इस उत्तर के लिए कुछ अंक मिले हैं, मैंने इसे और अधिक जानकारी जोड़ने का निर्णय लिया है।

एक अधिक विस्तृत उत्तर:

दूसरे के बीच द्विआधारी में सकारात्मक और नकारात्मक संख्या का प्रतिनिधित्व करने के चार मुख्य दृष्टिकोण हैं, अर्थात्:

  1. हस्ताक्षरित परिमाण
  2. एक के पूरक
  3. दो का अनुपूरण
  4. पक्षपात

1. हस्ताक्षर परिमाण

चिन्ह का प्रतिनिधित्व करने के लिए सबसे महत्वपूर्ण बिट का उपयोग करता है, शेष बिट्स को पूर्ण मूल्य का प्रतिनिधित्व करने के लिए उपयोग किया जाता है। जहां 0 एक सकारात्मक संख्या का प्रतिनिधित्व करता है और 1 एक नकारात्मक संख्या को दर्शाता है, उदाहरण:

 1011 = -3 0011 = +3 

यह प्रतिनिधित्व सरल है। हालांकि, आप बाइनरी नंबरों को उसी तरह से जोड़ नहीं सकते हैं जिससे आप दशमलव संख्या जोड़ते हैं, जिससे हार्डवेयर स्तर पर इसे लागू करना मुश्किल हो जाता है। इसके अलावा, यह दृष्टिकोण 0, 100 … 0 और 0 …. 0 का प्रतिनिधित्व करने के लिए दो बाइनरी पैटर्न का उपयोग करता है।

2. एक के पूरक

इस प्रतिनिधित्व में, हमने अपने पूरक को जानने के लिए किसी दिए गए नंबर के सभी बिट्स को उलट कर दिया है। उदाहरण के तौर पर:

 010 = 2, so -2 = 101 (inverting all bits). 

इस प्रतिनिधित्व की समस्या यह है कि अभी भी 0 (00..0 और 11..1 का प्रतिनिधित्व करने के लिए दो बिट पैटर्न मौजूद हैं)

3. दो के पूरक

किसी संख्या के नकारात्मक को खोजने के लिए, इस प्रतिनिधित्व में, हम सभी बिट्स को उलट कर देते हैं और फिर एक बिट जोड़ते हैं। एक बिट जोड़ना 2 बिट पैटर्न का प्रतिनिधित्व करने की समस्या को हल करता है। इस प्रतिनिधित्व में हमारे पास केवल एक (00 … 0) है।

उदाहरण के लिए, हम 4 बिट (दशमलव) के द्विआधारी नकारात्मक प्रतिनिधित्व को 4 बिट्स का उपयोग करना चाहते हैं। पहले हम द्विआधारी को 4 रूपांतरित करते हैं:

 4 = 0100 

तो हम सभी बिट्स को उलट कर देते हैं

 0100 -> 1011 

अंत में हम एक बिट जोड़ते हैं

 1011 + 1 = 1100. 

इसलिए 1100 दशमलव में -4 के समतुल्य है, अगर हम 4 बीट्स के साथ टू कॉमप्लेंट बाइनरी प्रस्तुति का उपयोग कर रहे हैं।

पूरक का पता लगाने का एक तेज़ तरीका है कि पहले बिट को तय करने से कि मूल्य 1 और शेष बिट्स को चालू कर दिया गया है। उपरोक्त उदाहरण में ऐसा कुछ होगा:

 0100 -> 1100 ^^ ||-(fixing this value) |--(inverting this one) 

दो के पूरक आंकड़े, 0 के लिए केवल एक प्रतिनिधित्व के अलावा, यह दो द्विआधारी मान भी उसी तरह जोड़ता है जो दशमलव में, अलग-अलग संकेतों के साथ भी संख्याएं फिर भी, अतिप्रवाह मामलों की जांच करना आवश्यक है।

4. पूर्वाग्रह

यह प्रतिनिधित्व फ्लोटिंग पॉइंट के लिए आईईईई 754 आदर्श में एक्सपोनेंट का प्रतिनिधित्व करने के लिए किया जाता है। इसका फायदा यह है कि शून्य से सभी बिट्स के साथ बाइनरी वैल्यू सबसे छोटा मान का प्रतिनिधित्व करता है। और 1 से सभी बिट्स के साथ बाइनरी वैल्यू सबसे बड़ा मूल्य दर्शाता है जैसा कि नाम इंगित करता है, मान बायो (सामान्यतः 2 ^ (एन -1) या 2 ^ (एन -1) -1) के साथ एन बिट्स के साथ बाइनरी में (सकारात्मक या नकारात्मक) एन्कोड किया जाता है।

इसलिए यदि हम 8 बिट्स का उपयोग कर रहे हैं, तो मान के द्वारा 2 ^ (n-1) के पूर्वाग्रह का उपयोग करके द्विआधारी में दशमलव 1 मान का प्रतिनिधित्व किया जाता है:

 +1 + bias = +1 + 2^(8-1) = 1 + 128 = 129 converting to binary 1000 0001 

जावा पूर्णांक 32 बिट्स के हैं, और हमेशा हस्ताक्षरित हैं इसका मतलब है, सबसे महत्वपूर्ण बिट (एमएसबी) साइन बिट के रूप में काम करता है। पूर्णांक द्वारा पूर्णांक का प्रतिनिधित्व किया जाता है, लेकिन बिट्स का भारित राशि नहीं है। भार निम्नानुसार सौंपे गए हैं:

 Bit# Weight 31 -2^31 30 2^30 29 2^29 ... ... 2 2^2 1 2^1 0 2^0 

ध्यान दें कि एमएसबी का वजन नकारात्मक है (वास्तव में सबसे बड़ा संभावित नकारात्मक), इसलिए जब यह बिट चालू होता है, संपूर्ण संख्या (भारित राशि) नकारात्मक हो जाती है

चलिए इसे 4-बिट नंबरों के साथ अनुकरण करते हैं:

 Binary Weighted sum Integer value 0000 0 + 0 + 0 + 0 0 0001 0 + 0 + 0 + 2^0 1 0010 0 + 0 + 2^1 + 0 2 0011 0 + 0 + 2^1 + 2^0 3 0100 0 + 2^2 + 0 + 0 4 0101 0 + 2^2 + 0 + 2^0 5 0110 0 + 2^2 + 2^1 + 0 6 0111 0 + 2^2 + 2^1 + 2^0 7 -> the most positive value 1000 -2^3 + 0 + 0 + 0 -8 -> the most negative value 1001 -2^3 + 0 + 0 + 2^0 -7 1010 -2^3 + 0 + 2^1 + 0 -6 1011 -2^3 + 0 + 2^1 + 2^0 -5 1100 -2^3 + 2^2 + 0 + 0 -4 1101 -2^3 + 2^2 + 0 + 2^0 -3 1110 -2^3 + 2^2 + 2^1 + 0 -2 1111 -2^3 + 2^2 + 2^1 + 2^0 -1 

इसलिए, दो पूरक गुण नकारात्मक integers का प्रतिनिधित्व करने के लिए एक विशेष योजना नहीं है, बल्कि हम यह कह सकते हैं कि integers के द्विआधारी प्रतिनिधित्व हमेशा समान होते हैं, हम सिर्फ सबसे महत्वपूर्ण बिट के वजन को नकार देते हैं और वह बिट पूर्णांक का संकेत निर्धारित करता है।

सी में, एक कीवर्ड unsigned (जावा में उपलब्ध नहीं है) है, जिसका उपयोग unsigned int x; घोषित करने के लिए किया जा सकता है unsigned int x; । अहस्ताक्षरित पूर्णांक में, एमएसबी का वजन नकारात्मक होने की बजाय सकारात्मक ( 2^31 ) है उस स्थिति में एक unsigned int की सीमा 0 से 2^32 - 1 , जबकि एक int की श्रेणी -2^31 से 2^31 - 1

दूसरे दृष्टिकोण से, यदि आप x के दो पूरक के रूप में ~x + 1 (not x plus one) पर विचार करते हैं, तो यहां स्पष्टीकरण दिया गया है:

किसी भी x , ~x बिटwise व्युत्क्रम है, इसलिए जहां x में 1 बीटी है, ~x 0 बीटी होगी (और इसके विपरीत)। इसलिए, यदि आप इन जोड़ते हैं, तो अतिरिक्त में कोई ले जाना नहीं होगा और योग केवल एक पूर्णांक होगा, जिसमें से प्रत्येक बिट 1

32-बिट पूर्णांक के लिए:

 x + ~x = 1111 1111 1111 1111 1111 1111 1111 1111 x + ~x + 1 = 1111 1111 1111 1111 1111 1111 1111 1111 + 1 = 1 0000 0000 0000 0000 0000 0000 0000 0000 

बाईं सबसे बड़ी 1 बिट को केवल खारिज किया जाएगा, क्योंकि यह 32-बिट (पूर्णांक अतिप्रवाह) में फिट नहीं है इसलिए,

 x + ~x + 1 = 0 -x = ~x + 1 

तो आप देख सकते हैं कि नकारात्मक x का प्रतिनिधित्व ~x + 1 द्वारा किया जा सकता है, जिसे हम दो के x के पूरक कहते हैं।

मैंने इसे जानने के लिए निम्नलिखित प्रोग्राम चलाया है

 public class Negative { public static void main(String[] args) { int i =10; int j = -10; System.out.println(Integer.toBinaryString(i)); System.out.println(Integer.toBinaryString(j)); } } 

आउटपुट है

 1010 11111111111111111111111111110110 

उत्पादन से लगता है कि यह दो पूरक का उपयोग कर रहा है।

ओरेकल, जावा डेटाटाइप के बारे में कुछ दस्तावेज प्रदान करता है, जिन्हें आपको दिलचस्प मिल सकता है। विशेष रूप से:

int: इंट डेटा प्रकार एक 32-बिट पर हस्ताक्षर किए दो के पूरक पूर्णांक इसका न्यूनतम मूल्य -2,147,483,648 और अधिकतम मूल्य 2,147,483,647 (सम्मिलित) है।

बीटीडब्ल्यू, लघु को दो पूरक के रूप में भी संग्रहित किया जाता है।

इस दस्तावेज़ के अनुसार, सभी पूर्णांक पर हस्ताक्षर और दो के पूरक प्रारूप में जावा के लिए जमा है। इसकी विश्वसनीयता निश्चित नहीं है ..

सबसे महत्वपूर्ण बिट (32 वें) इंगित करता है कि संख्या सकारात्मक या नकारात्मक है। यदि यह 0 है, तो इसका मतलब है कि संख्या सकारात्मक है और यह अपने वास्तविक बाइनरी प्रतिनिधित्व में संग्रहीत है। लेकिन यदि यह 1 है, तो इसका मतलब है कि संख्या नकारात्मक है और उसके दो पूरक प्रतिनिधित्व में संग्रहीत है। इसलिए जब हम वजन -2 ^ 32 को 32 वें बिट देते हैं, जबकि इसके बाइनरी प्रस्तुति से पूर्णांक मान को बहाल करते हैं, हमें वास्तविक उत्तर मिलता है।

धन्यवाद, उत्तर के लिए dreamcrash https://stackoverflow.com/a/13422442/1065835 ; विकी पृष्ठ पर वे एक उदाहरण देते हैं जो मुझे समझने में मदद करता है कि कैसे एक सकारात्मक संख्या के नकारात्मक समकक्ष के द्विआधारी प्रतिनिधित्व को पता चलता है।

उदाहरण के लिए, 1 बाइट (= 2 nibbles = 8 बिट्स) का उपयोग करते हुए, दशमलव संख्या 5 द्वारा प्रस्तुत किया जाता है

0000 01012 सबसे महत्वपूर्ण बिट 0 है, इसलिए पैटर्न एक गैर-नकारात्मक मूल्य का प्रतिनिधित्व करता है। दो-पूरक-संरेखण में -5 को परिवर्तित करने के लिए, बिट्स उलटा हो जाते हैं; 0 1 हो जाता है, और 1 बन जाता है 0:

1111 1010 इस बिंदु पर, अंक दशमलव मूल्य -5 के पूरक हैं। दो पूरकों को प्राप्त करने के लिए, परिणाम को 1 जोड़ा जाता है, जिससे:

1111 1011 परिणाम एक हस्ताक्षरित द्विआधारी संख्या है जो दशमलव मूल्य -5 का प्रतिनिधित्व करता है, जो दो के पूरक रूप में है। सबसे महत्वपूर्ण बिट 1 है, इसलिए दर्शाया गया मूल्य नकारात्मक है।

सकारात्मक संख्या सीधे बाइनरी में जमा की जाती है नकारात्मक संख्याओं के लिए 2 की तारीफ आवश्यक है

उदाहरण के लिए:

15: 00000000 00000000 00000000 00001111
-15: 11111111 11111111 11111111 11110001

यहाँ हस्ताक्षर किए बिट में अंतर है

सकारात्मक संख्याओं को संग्रहीत / पुनर्प्राप्त किया जाता है क्योंकि यह है।

 eg) For +ve number 10; byte representation will be like 0-000 0010 (0 - MSB will represent that it is +ve). So while retrieving based on MSB; it says it is +ve, so the value will be taken as it is. 

लेकिन नकारात्मक संख्या 2 के पूरक (एमएसबी बिट के अलावा) के बाद संग्रहीत की जाएगी, और एमएसबी बिट को 1 पर सेट किया जाएगा।

उदाहरण के लिए) जब भंडारण -10 फिर

  0-000 0010 -> (1's complement) -> 0-111 1101 -> (2's complement) 0-111 1101 + 1 -> 0-111 1110 Now MSB will be set to one, since it is negative no -> 1-111 1110 

पुनर्प्राप्त करते समय, यह पाया गया कि एमएसबी 1 पर सेट है। इसलिए यह नकारात्मक नहीं है और 2 का पूरक एमएसबी के अलावा किया जाएगा

  1-111 1110 --> 1-000 0001 + 1 --> 1-000 0010 Since MSB representing this is negative 10 --> hence -10 will be retrived. 

ढलाई

यह भी ध्यान रखें कि जब आप बाइट के लिए int / short casting कर रहे हैं, तो अंतिम बाइट एमएसबी के साथ ही अंतिम बाइट के साथ विचार किया जाएगा,

उदाहरण के लिए "-130" कम करें, इसे नीचे की तरह संग्रहीत किया जा सकता है

 (MSB)1-(2's complement of)130(1000 0010) --> 1-111 1111 0111 1110 

अब बाइट कास्टिंग ने पिछले बाइट को लिया है जो 0111 1110 है। (0-एमएसबी) चूंकि एमएसबी कहते हैं कि यह वैल्यू है, इसलिए इसे लिया जाएगा जैसा कि यह है। जो 126 है। (+ Ve)

एक और उदाहरण "130" संक्षिप्त करें, इसे नीचे की तरह संग्रहीत किया जा सकता है

  0-000 000 1000 0010 (MSB = 0) 

अब बाइट कास्टिंग पिछले बाइट जो 1000 0010 है। (1 = एमएसबी) चूंकि एमएसबी कहते हैं कि यह मूल्य है, 2 का पूरक होगा और नकारात्मक नंबर वापस किया जाएगा। तो इस मामले में -126 वापस किया जाएगा।

  1-000 0010 -> (1's complement) -> 1-111 1101 -> (2's complement) 1-111 1101 + 1 -> 1-111 1110 -> (-)111 1110 = -126 

अंतर (एट) (चार) (बाइट) -1 और (इंट) (लघु) (बाइट) -1 के बीच अंतर

 (byte)-1 -> 0-000 0001 (2's Comp) -> 0-111 1111 (add sign) -> 1-111 1111 (char)(byte)-1 -> 1-111 1111 1111 1111 (sign bit is carry forwarded on left) 

उसी प्रकार

 (short)(byte)-1-> 1-111 1111 1111 1111 (sign bit is carry forwarded on left) 

परंतु

 (int)(char)(byte)-1 -> 0-0000000 00000000 11111111 11111111 = 65535 since char is unsigned; MSB won't be carry forwarded. 

तथा

 (int)(Short)(byte)-1 -> 1-1111111 11111111 11111111 11111111 = -1 since short is signed; MSB is be carry forwarded. 

संदर्भ

नकारात्मक संख्या का प्रतिनिधित्व करने के लिए दो पूरक हैं?

"2 के पूरक" क्या है?

सकारात्मक पूर्णांक 2 के लिए 'पूरक मूल्य एमएसबी बिट 0 के समान है (like +14 2'complement is 01110)

केवल नकारात्मक पूर्णांक के लिए हम केवल (-14= 10001+1 = 10010) सम्मेलन मूल्य (-14= 10001+1 = 10010) गणना कर रहे हैं।

तो अंतिम उत्तर दोनों वैल्यू (+ve and -ve) दोनों (+ve and -ve) संपार्श्विक फॉर्म में ही जमा किए जाते हैं।