سؤال

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));
}
}

ويتم تحليل وصحيح بأنها "وقعت منذ فترة طويلة" أن التعامل مع هذا العدد إيجابي كبير ثم يتم العثور على علامة الظهر من قبل الصب إلى "كثافة".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top