2015-07-15 15 views
5

क्यों इस कोडअंडरस्कोर्स इंटीग्रर्स के व्यवहार को बदलते हैं?

int[] a = { 
    0, 
    1, 
    1_0, 
    0_1, 
    1_0_0, 
    0_1_0, 
    0_0_1 
}; 

System.out.println(Arrays.toString(a)); 

उपज इस उत्पादन [0, 1, 10, 1, 100, 8, 1] करता है?

आउटपुट में 8 क्यों है? अंडरस्कोर कुछ गुप्त कार्यक्षमता जोड़ें?

उत्तर

4

"0" से शुरू होने वाले आपके कोड में पूर्णांक दशमलव प्रणाली के बजाय Octal system का उपयोग करके व्याख्या किए जाते हैं।

तो ऑक्टल में आपका 010 दशमलव के बराबर 8 के बराबर है।

आपके 0_1 और आपके 0_0_1 को भी इस तरह से व्याख्या किया गया है, लेकिन आप इसे नहीं देख सकते हैं क्योंकि वे सभी सभी संख्याओं में 1 का प्रतिनिधित्व करते हैं।

अन्य संख्या प्रणाली है कि जावा कम्पाइलर समझता उपसर्ग "0x" के साथ Hexadecimal कर रहे हैं और Binary उपसर्ग "0b" के साथ (ताकि 0x10 16 दशमलव में के बराबर है) (ताकि 0b10 दशमलव में 2 के बराबर है)।

0

आपने पिछले दो के लिए ऑक्टल नोटेशन का उपयोग किया है। यह वास्तव में जावा के लिए अद्वितीय नहीं है। यदि आपके पास कुछ पूर्णांक के सामने एक अग्रणी शून्य है, तो इसे ऑक्टल में गिना जाएगा।

ऑक्टल क्या है? यह गिनती का आधार -8 प्रणाली है। हम मानते हैं कि हम आधार 10 प्रणाली का उपयोग करते हैं, जब हम 0 से शुरू होते हैं, 9 से समाप्त होते हैं, और प्रत्येक अंक को अगले अंक में घुमाते हैं, जब हम पिछले अंक में पिछले 9 कदम उठाते हैं। ऑक्टल वही तरीका है, जब आप पिछले 7 कदम उठाते हैं तो रोलओवर होता है।

बाइनरी पर विचार करें, जो बेस 2 है। आपके अंक 1 और 0 हैं, और पिछले चरण में कदम से अंक बढ़ने के लिए अंक का कारण बन जाएगा अगला।

base2 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 

base8 0000 0001 0002 0003 0004 0005 0006 0007 0010 0011 0012 0013 

base10 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 
0

जब आप एक 0 साथ एक नंबर पूर्व में होना, जावा अष्टाधारी के रूप में व्यवहार करता है। 010 octal में 8 दशमलव में है।

0

जावा और कई अन्य भाषाओं में, 0 के साथ एक पूर्णांक शाब्दिक शुरुआत को ऑक्टल (बेस 8) मात्रा के रूप में व्याख्या किया जाता है। Why is 08 not a valid integer literal in Java?

2

आपने पूर्णांक तोड़ नहीं दिया। जब आप 0 के साथ संख्यात्मक शाब्दिक नेतृत्व करते हैं, तो आप ऑक्टल संख्याओं के साथ समाप्त होते हैं। इसलिए 0_1_0 = 8 अष्टाधारी में और 0_1 और 0_0_1 दोनों अभी भी 1.

गहराई जवाब में एक और अधिक के लिए Java 7 underscore in numeric literals पर एक नजर डालें कर रहे हैं।

1

अंडरस्कोर केवल readability में सुधार करता है।

कुछ उदाहरण:

long creditCardNumber = 1234_5678_9012_3456L; 
long socialSecurityNumber = 999_99_9999L; 

अजीब व्यवहार नंबर की अष्टाधारी अंकन जो हमेशा एक अग्रणी शून्य के साथ शुरू होता है के कारण है।

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