2009-05-10 9 views
8
public class Main3 { 
    public static void main(String[] args) { 
     Integer min = Integer.MIN_VALUE; 
     String minHex = Integer.toHexString(Integer.MIN_VALUE); 

     System.out.println(min + " " + minHex); 
     System.out.println(Integer.parseInt(minHex, 16)); 
    } 
} 

देताजावा नकारात्मक पूर्णांक हेक्स के लिए और वापस में विफल रहता है

-2147483648 80000000 
Exception in thread "main" java.lang.NumberFormatException: For input string: "80000000" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
    at java.lang.Integer.parseInt(Integer.java:459) 
    at Main3.main(Main3.java:7) 

क्या है?

उत्तर

10

यह दस्तावेज़ीकरण किया गया है कि Integer.toHexString रिटर्न एक अहस्ताक्षरित मूल्य के रूप में पूर्णांक के एक स्ट्रिंग प्रतिनिधित्व - Integer.parseInt एक हस्ताक्षरित पूर्णांक लेता है, जबकि आप Integer.toString(value, 16) का उपयोग करते हैं बजाय आप आप क्या चाहते हैं मिलेगा

+0

यह शांत हो गया होता अगर वहाँ था हेक्स से कन्वर्ट करने के लिए/लंबे सिर्फ रखने बिट्स int करने के लिए एक विधि संकेत के बारे में देखभाल किए बिना। इस तरह कम से कम ओवरहेड के साथ आगे और पीछे परिवर्तित करना संभव होता। – akostadinov

1

आपको include a negative साइन इन करने की आवश्यकता है। नकारात्मक नहीं

Integer min = Integer.MIN_VALUE + 1; 

यह बम नहीं होगा, लेकिन आप एक सकारात्मक संख्या देना होगा (:

मैं अब इस अधिकार का परीक्षण करने के लिए उपयोग नहीं है, लेकिन मुझे यकीन है चाहते हैं, तो आप यह मान के बजाय की कोशिश की) जब आप ParseInt(min,16) चलाते थे।

बिट्स के बिट्स में वास्तव में इस संदर्भ में साइन निर्धारित करने के लिए पर्याप्त जानकारी नहीं है, इसलिए आपको इसे प्रदान करने की आवश्यकता है। (उस मामले पर विचार करें जहां आप min = "F" का उपयोग करते हैं। क्या वह +/- एफ है? यदि आपने इसे बिट्स में परिवर्तित किया है और 1111, और देखा है, तो आपको पता था कि यह एक बाइट था, आप निष्कर्ष निकाल सकते हैं कि यह नकारात्मक है, लेकिन यह बहुत सारे ifs है।

2

इस प्रयास करें:

।।
public class Main3 { 
    public static void main(String[] args) { 
     Integer min = Integer.MIN_VALUE; 
     String minHex = Integer.toHexString(Integer.MIN_VALUE); 

     System.out.println(min + " " + minHex); 
     System.out.println(Integer.parseInt("-" + minHex, 16)); 
    } 

}

इस पाने के लिए:

-2147483648 80000000 
-2147483648 
12

यह कुछ ऐसा है हमेशा मुझे नाराज कर रहा है। यदि आप एक हेक्स शाब्दिक के साथ एक int प्रारंभ करते हैं, तो आप 0xFFFFFF तक सकारात्मक मानों की पूरी श्रृंखला का उपयोग कर सकते हैं; 0x7FFFFF से बड़ा कुछ भी वास्तव में एक नकारात्मक मूल्य होगा। बिट मास्किंग और अन्य परिचालनों के लिए यह बहुत आसान है जहां आप केवल स्थानों बिट्स के बारे में परवाह करते हैं, न कि उनके अर्थ।

लेकिन यदि आप एक स्ट्रिंग को एक पूर्णांक में बदलने के लिए Integer.parseInt() का उपयोग करते हैं, तो "0x7FFFFFFF" से बड़ा कुछ भी एक त्रुटि के रूप में माना जाता है। शायद एक अच्छा कारण है कि उन्होंने ऐसा क्यों किया, लेकिन यह अभी भी निराशाजनक है।

सबसे सरल कामकाज Long.parseLong() के बजाय उपयोग करना है, फिर परिणाम को int में डालें।

int n = (int)Long.parseLong(s, 16); 
बेशक

, आपको लगता है कि यदि आप सुनिश्चित कर रहे हैं संख्या श्रेणी Integer.MIN_VALUE..Integer.MAX_VALUE में होने जा रहा है केवल क्या करना चाहिए।

0

यह मेरे लिए काम करने के लिए लग रहे हैं: के रूप में एक "लंबे समय हस्ताक्षर किए गए" कि इस तरह के बड़े सकारात्मक संख्या को संभाल और फिर संकेत यह कास्टिंग के लिए "पूर्णांक" द्वारा वापस पाया जाता है

public class Main3 { 
public static void main(String[] args) { 
    Integer min = Integer.MIN_VALUE; 
    String minHex = Integer.toHexString(Integer.MIN_VALUE); 

    System.out.println(min + " " + minHex); 
    System.out.println((int)Long.parseLong(minHex, 16)); 
} 
} 

पूर्णांक पार्स किया गया है।

3

अनुसार प्रलेखन, toHexString रिटर्न "आधार 16 में एक अहस्ताक्षरित पूर्णांक के रूप में पूर्णांक तर्क के एक स्ट्रिंग प्रतिनिधित्व।"

तो सही रिवर्स आपरेशन शायद Integer.parseUnsignedInt कि जावा 8 के हिस्से के रूप पेश किया गया था:

public class Main3 { 
    public static void main(String[] args) { 
     Integer min = Integer.MIN_VALUE; 
     String minHex = Integer.toHexString(Integer.MIN_VALUE); 

     System.out.println(min + " " + minHex); 
     System.out.println(Integer.parseUnsignedInt(minHex, 16)); 
    } 
संबंधित मुद्दे