मैं कुछ अजीब जावा व्यवहार को ट्रैक करने की कोशिश कर रहा था। मेरे पास एक सूत्र है जिसमें एक डबल शामिल है, लेकिन एक पूर्णांक उत्तर देने के लिए "गारंटीकृत" है - विशेष रूप से, एक हस्ताक्षरित 32-बिट पूर्णांक (जो, हां, जावा अच्छी तरह से नहीं करता है)। दुर्भाग्य से, मेरे जवाब कभी-कभी गलत थे।जावा पूर्णांक-प्रकार आदिम कास्टिंग प्रकार के MAX_INT पर "कैप्ड" होता है?
आखिरकार मैं इस मुद्दे पाया है, लेकिन व्यवहार अभी भी मेरे लिए बहुत करने के लिए अजीब है: एक long
जबकि एक double
डाली एक double
डाली एक int
करने के लिए सीधे एक हस्ताक्षरित पूर्णांक के लिए MAX_INT
पर सीमित कर दिया है, कि हैint
पर डाला गया मुझे अपेक्षित उत्तर देता है (-1; एक हस्ताक्षरित 32-बिट पूर्णांक का MAX INT हस्ताक्षरित 32-बिट पूर्णांक के रूप में दर्शाया गया है)।
Long is: 4123456789
Translated to Int is:-171510507
Long 2 is: 4294967295
Translated to Int is:-1
Max UInt as Double: 4.294967295E9
Max UInt from Double to Long: 4294967295
Max UInt from Double to Int: 2147483647
// MAX INT for an unsigned int
Formula test: 2147483647
// Binary: all 1s, which is what I expected
Formula Test with Double Cast: -1
नीचे दो पंक्तियों वाले मैं समझने की कोशिश कर रहा हूँ कर रहे हैं: जब मैं इस छोटे से कार्यक्रम मैं चलाने
public static void main(String[] args) {
// This is the Max Int for a 32-bit unsigned integer
double maxUIntAsDouble = 4294967295.00;
long maxUintFromDoubleAsLong = (long)maxUIntAsDouble;
long maxUintFromDoubleAsInt = (int)maxUIntAsDouble;
int formulaTest = (int) (maxUintFromDoubleAsLong * 1.0);
int testFormulaeWithDoubleCast = (int)((long) (maxUintFromDoubleAsLong * 1.0));
// This is a more-or-less random "big number"
long longUnderTest = 4123456789L;
// Max int for a 32-bit unsigned integer
long longUnderTest2 = 4294967295L;
int intFromLong = (int) longUnderTest;
int intFromLong2 = (int) longUnderTest2;
System.out.println("Long is: " + longUnderTest);
System.out.println("Translated to Int is:" + intFromLong);
System.out.println("Long 2 is: " + longUnderTest2);
System.out.println("Translated to Int is:" + intFromLong2);
System.out.println("Max UInt as Double: " + maxUIntAsDouble);
System.out.println("Max UInt from Double to Long: " + maxUintFromDoubleAsLong);
System.out.println("Max UInt from Double to Int: " + maxUintFromDoubleAsInt);
System.out.println("Formula test: " + formulaTest);
System.out.println("Formula Test with Double Cast: " + testFormulaeWithDoubleCast);
}
:
मैं एक छोटे से परीक्षण कार्यक्रम में लिखा था। डबल कास्ट मुझे अपेक्षित "-1" देता है; लेकिन सीधी कास्ट मुझे 32-बिट हस्ताक्षरित पूर्णांक के लिए MAX_INT देता है। एक सी ++ पृष्ठभूमि से आ रहा है, मैं समझूंगा कि अगर मुझे अपेक्षित -1 (उर्फ "बेवकूफ कास्टिंग") के बजाय मुझे "विषम संख्या" दी गई है, लेकिन यह मुझे परेशान कर रहा है।
तो, सवाल तो करने के लिए: जावा में इस "उम्मीद" व्यवहार (जैसे किसी भी double
डाली एक int
के लिए सीधे MAX_INT
करने के लिए "छाया हुआ" किया जाएगा) है? क्या किसी भी अप्रत्याशित प्रकार के लिए यह कास्टिंग करता है? मैं उम्मीद करता हूं कि यह short
और byte
के लिए समान होगा, उदाहरण के लिए; लेकिन फ्लोट करने के लिए एक oversized-double कास्टिंग करते समय 'अपेक्षित व्यवहार' क्या है?
धन्यवाद!
मुझे जावा में "हस्ताक्षरित" की कमी के बारे में पता था (चीजों में से एक जो जावा को इस तरह का दर्द बनाता है जब बिट-ओरिएंटेड प्रोटोकॉल के साथ काम करते हैं), लेकिन बाकी के अधिकांश ब्रांड-नए हैं। निश्चित रूप से "शॉर्ट" और "बाइट" से व्यवहार की अपेक्षा नहीं की होगी। धन्यवाद। : डी –