हे, जिज्ञासु। मुझे लगता है कि यह एक "जानबूझकर बग" है, इसलिए बोलने के लिए।
अंतर्निहित कारण यह है कि इंटेगर वर्ग कैसे लिखा जाता है। मूल रूप से, parseInt सकारात्मक संख्याओं के लिए "अनुकूलित" है। जब यह स्ट्रिंग को पार्स करता है, तो यह परिणाम को संचयी रूप से बनाता है, लेकिन नकारात्मक। फिर यह अंतिम परिणाम के संकेत को फ़्लिप करता है।
उदाहरण:
66 = 0x42
पार्स किया गया जैसे:
4*(-1) = -4
-4 * 16 = -64 (hex 4 parsed)
-64 - 2 = -66 (hex 2 parsed)
return -66 * (-1) = 66
अब, अपने उदाहरण FFFF8000 को देखें
16*(-1) = -16 (first F parsed)
-16*16 = -256
-256 - 16 = -272 (second F parsed)
-272 * 16 = -4352
-4352 - 16 = -4368 (third F parsed)
-4352 * 16 = -69888
-69888 - 16 = -69904 (forth F parsed)
-69904 * 16 = -1118464
-1118464 - 8 = -1118472 (8 parsed)
-1118464 * 16 = -17895552
-17895552 - 0 = -17895552 (first 0 parsed)
Here it blows up since -17895552 < -Integer.MAX_VALUE / 16 (-134217728).
Attempting to execute the next logical step in the chain (-17895552 * 16)
would cause an integer overflow error.
संपादित करें (जोड़): parseInt () के लिए "लगातार" के लिए काम करने के लिए -Integer.MAX_VALUE <= n <= Integer.MAX_VALUE, जब वे -Integer.MAX_VALUE में पहुंचते हैं तो उन्हें "रोटेट" करना होगा। संचयी परिणाम, पूर्णांक सीमा के अधिकतम छोर पर शुरू होता है और वहां से नीचे की ओर जारी रहता है। उन्होंने ऐसा क्यों नहीं किया, जोश बलोच से पूछना होगा या जिसने भी इसे पहले स्थान पर लागू किया है। यह सिर्फ एक अनुकूलन हो सकता है।
तथापि,
Hex=Integer.toHexString(Integer.MAX_VALUE);
System.out.println(Hex);
System.out.println(Integer.parseInt(Hex.toUpperCase(), 16));
बस ठीक काम करता है, सिर्फ इस कारण से। इंटेगर के लिए स्रोत में आप इस टिप्पणी को पा सकते हैं।