2015-09-29 8 views
6

मैं तेजी से 2,0जावा बनाम स्विफ्ट में एक लंबे से int int कैसे परिवर्तित करें?

long checksumValue = 4253726258L; 
int liCrc32 = (int)checksumValue; 
System.out.println("liCrc32" + liCrc32) 

LiCrc32 को जावा में इस कोड को बदलने की कोशिश करने के लिए -41241038

मेरे तेज संस्करण

let int64: Int64 = 4253726258 
let a:Int = Int(int64) 

बराबर एक रिटर्न मुझे 4253726258

है क्या मुझे समझ में नहीं आता क्यों जावा में मूल्य ऋणात्मक है?

+0

संख्या एक जावा '' int'' में फिट बहुत बड़ा है । आप इसे 'int'' क्यों डालते हैं? सभी तरह से '' long'' का प्रयोग करें। – f1sh

+0

टीक्स। मैं ऐसा करूँगा! – Bolo

उत्तर

3

आप एक गलत प्रकार का प्रयोग कर रहे है दे रही है int, क्योंकि इसका आकार प्लेटफ़ॉर्म-विशिष्ट है। आपके आउटपुट से निर्णय लेते हुए, आपका प्लेटफार्म 64-बिट Int एस का उपयोग करता है। यह इस तरह की पुष्टि करता है:

println(sizeof(Int)) // Should print 8 on your platform 

Int32 जावा के int मेल खाता है। दुर्भाग्यवश, यह परिवर्तन

let int64: Int64 = 4253726258 
let a:Int32 = Int32(int64) 

स्विफ्ट के कार्यान्वयन में एक बग के कारण समस्याएं पैदा कर सकता है।

आप एक 32-बिट मूल्य पंजीकरण का विस्तार करने की जरूरत है, तो आप इसे इस तरह से कर सकते हैं:

let int64: Int64 = 4253726258 
let a:Int = Int((int64 << 32) >> 32) 
println(a) // prints -41241038 

Demo.

+0

मैं उत्सुक हूं: क्या * बग * आपकी बात कर रहे हैं? - 'एक = Int32 (truncatingBitPattern: int64) किसी भी मामले में सही ढंग से काम करना चाहिए। –

+0

@ मार्टिनआर मैंने दो लाइन कोड स्निपेट को [http://www.runswiftlang.com/](http://www.runswiftlang.com/) में चिपकाया, और एक अवैध निर्देश के साथ एक क्रैश हो गया: '9490 9 अवैध निर्देश : 4 'मुझे कोड को चिपकाने का एक ही परिणाम मिला [http://swiftstub.com/](http://swiftstub.com/), सिवाय इसके कि वे एक संदेश के साथ त्रुटि को "मास्क" करते हैं जो उन्हें लगता है कि यह मजाकिया लगता है (यह नहीं करता है)। – dasblinkenlight

+0

मुझे नहीं लगता कि यह एक बग है। 'Int32 (_ v: Int64)' कन्स्ट्रक्टर 'Int32 (truncatingBitPattern v: Int64) 'के विपरीत, अंतर्निहित रूप से (और अतिप्रवाह के मामले में बंद) को छोटा नहीं करता है। –

4
Swift documentation

Int

से

ज्यादातर मामलों में, आप अपने कोड में उपयोग करने के लिए पूर्णांक के एक विशिष्ट आकार लेने की जरूरत नहीं है। , एक 32-बिट मंच पर

  • IntInt32 रूप में एक ही आकार है: स्विफ्ट एक अतिरिक्त पूर्णांक प्रकार, जे, जो वर्तमान मंच के मूल शब्द आकार के रूप में एक ही आकार है प्रदान करता है।

  • 64-बिट प्लेटफार्म पर, IntInt64 जैसा ही आकार है।

जब तक आप, पूर्णांक के एक विशिष्ट आकार के साथ काम हमेशा अपने कोड में पूर्णांक मूल्यों के लिए Int उपयोग करने के लिए की जरूरत है। यह कोड स्थिरता और इंटरऑपरेबिलिटी सहायता करता है। 32-बिट प्लेटफॉर्म पर भी, इंट को -2,147,483,648 और 2,147,483,647 के बीच किसी भी मान को स्टोर कर सकता है, और यह पूर्णांक श्रेणियों के लिए काफी बड़ा है।

Java's int, on the other hand, is always 4 bytes.

अभिन्न प्रकार byte, short, int, और long, जिसका मान हैं 8 बिट, 16 बिट, 32-बिट और 64-बिट पर हस्ताक्षर किए हैं दो के पूरक पूरक, क्रमशः, [...]

एक long से एक int में कास्ट करना एक narrowing primitive conversion

एक संकुचन आदिम रूपांतरण अंकीय मान की समग्र परिमाण के बारे में जानकारी खो सकते हैं का कारण बनता है और यह भी परिशुद्धता और रेंज खो सकते हैं।

+0

यह उत्तर बहुत उपयोगी है – Leo

2

पूर्णांक: डिफ़ॉल्ट रूप से, पूर्णांक डेटा प्रकार एक 32-बिट दो के पूरक पूर्णांक है, जो -231 की एक न्यूनतम मूल्य और 231-1 की एक अधिकतम महत्व है पर हस्ताक्षर किए है। जावा एसई 8 और बाद में, आप इंटिनेटेड 32-बिट पूर्णांक का प्रतिनिधित्व करने के लिए int डेटा प्रकार का उपयोग कर सकते हैं, जिसमें न्यूनतम मूल्य 0 और अधिकतम 232-1 का मान है। इंटिगर क्लास का उपयोग int डेटा को एक हस्ताक्षरित पूर्णांक के रूप में टाइप करने के लिए करें। अधिक जानकारी के लिए संख्या कक्षाएं अनुभाग देखें। तुलनात्मक रूप से स्थिर तरीके, हस्ताक्षर किए गए, divideUnsigned आदि को अंकगणित हस्ताक्षरित पूर्णांक के लिए संचालन का समर्थन करने के लिए इंटीजर क्लास में जोड़ा गया है।

लंबा: लंबा डेटा प्रकार 64-बिट दो का पूरक पूर्णांक है। हस्ताक्षरित लंबे समय का न्यूनतम मूल्य -263 है और अधिकतम मूल्य 263-1 है। जावा एसई 8 और बाद में, आप अप्रमाणित 64-बिट लंबे समय तक प्रतिनिधित्व करने के लिए लंबे डेटा प्रकार का उपयोग कर सकते हैं, जिसमें न्यूनतम मान 0 और अधिकतम 264-1 का मान है। इस डेटा प्रकार का उपयोग करें जब आपको int द्वारा प्रदान किए गए मानों की तुलना में की विस्तृत श्रृंखला की आवश्यकता होती है। लांग क्लास में विधियों की तरह भी शामिल है, बिना हस्ताक्षर किए गए, divideUnsigned आदि अंकगणित असाइन किए गए लंबे समय तक संचालन का समर्थन करने के लिए।

मतलब है कि जावा < जे 8 में एक पूर्णांक अधिक से अधिक हो सकता है: 4.253.726.258

वजह यह अपने int में या तो फिट नहीं कर सकते, तो आप:

2.147.483.647 

जो अपने पूर्णांक से छोटी है long पर चिपकने की आवश्यकता है या अपने जावा को संस्करण 8 में अपडेट करें और एक हस्ताक्षरित int बनाओ। स्विफ्ट की Int जरूरी जावा के मेल नहीं खाती:

क्या रूपांतरण के साथ होता है कि 2.147.483.647 के बाद, गिनती न्यूनतम संख्या (-2.147.483.647) से शुरू जारी है और अंत में आप -41241038 जो -2.147.483.647+ (4.253.726.258 - 2.147.483.647)

संबंधित मुद्दे