جافا السلبية الباحث إلى عرافة والعودة فشل
سؤال
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)
ماذا يكون ؟
المحلول
ووثقت أن Integer.toHexString
إرجاع تمثيل سلسلة صحيح كقيمة غير موقعة - بينما يأخذ Integer.parseInt
وكثافة العمليات وقعت. إذا كنت تستخدم Integer.toString(value, 16)
بدلا ستحصل على ما تريد.
نصائح أخرى
وهذا هو شيء ما في ازعاج لي دائما. إذا كنت تهيئة عدد صحيح مع عرافة الحرفي، يمكنك استخدام مجموعة كاملة من القيم الإيجابية حتى 0xFFFFFF
. وأي شيء أكبر من 0x7FFFFF
يكون حقا قيمة سالبة. هذا مفيد جدا لإخفاء بعض الشيء وغيرها من العمليات حيث كنت تهتم فقط حول <م> مواقع م> من البتات، وليس معانيها.
ولكن اذا كنت تستخدم Integer.parseInt () لتحويل سلسلة إلى عدد صحيح، يتم معاملة أي شيء أكبر من "0x7FFFFFFF"
أنه خطأ. ربما هناك سبب وجيه لماذا فعلوا ذلك بهذه الطريقة، لكنه ما زال محبطا.
وأبسط الحل هو استخدام Long.parseLong () بدلا من ذلك، ثم يلقي نتيجة لكثافة العمليات.
int n = (int)Long.parseLong(s, 16);
وبطبيعة الحال، يتعين عليك أن تفعل هذا فقط إذا كنت متأكدا من عدد سيكون في Integer.MIN_VALUE..Integer.MAX_VALUE
النطاق.
حسب الوثائق ، 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));
}
وجرب هذا:
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
وتحتاج إلى <لأ href = "http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Integer.html#parseInt٪28java.lang.String،٪20int٪ 29 "يختلط =" نوفولو noreferrer "> تتضمن علامة السلبي.
وأنا لا يستطيعون الوصول لاختبار هذا الحق الآن، ولكن كنت أراهن إذا حاولت هذه القيمة بدلا من ذلك:
Integer min = Integer.MIN_VALUE + 1;
وانها لن قصف، ولكن سوف أعطيك رقم موجب (وليس السلبي) عندما قمت بتشغيل ParseInt(min,16)
.
A <م> سلسلة م> البتات لا يملك في الواقع ما يكفي من المعلومات لتحديد علامة في هذا السياق لذلك تحتاج إلى تقديمها. (النظر في القضية حيث يمكنك استخدام min = "F"
. هل هذا +/- F؟ إذا كنت تحويلها إلى أشلاء ورأيت 1111، <م> و م> كنت أعرف أنه كان بايت، قد نستنتج أنه سلبي، ولكن هذا الكثير من المحاذير.
وهذا يبدو أن العمل بالنسبة لي:
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));
}
}
ويتم تحليل وصحيح بأنها "وقعت منذ فترة طويلة" أن التعامل مع هذا العدد إيجابي كبير ثم يتم العثور على علامة الظهر من قبل الصب إلى "كثافة".