Go में int और int64 के बीच अंतर क्या है?


86

मेरे पास एक स्ट्रिंग है जिसमें पूर्णांक (जो एक फ़ाइल से पढ़ा गया है) है।

मैं stringएक intका उपयोग करने के लिए परिवर्तित करने की कोशिश कर रहा हूँ strconv.ParseInt()ParseIntआवश्यकता है कि मैं एक बिटसाइज़ (बिट साइज़ 0, 8, 16, 32 और 64 int, int8, int16, int32 और int64 के अनुरूप) प्रदान करता हूँ।

फ़ाइल से पढ़ा गया पूर्णांक छोटा होता है (अर्थात इसे सामान्य इंट में फिट होना चाहिए)। यदि मैं 0 के बिट्साइज पास करता हूं, हालांकि, मुझे टाइप का परिणाम मिलता है int64(संभवत: क्योंकि मैं 64-बिट ओएस पर चल रहा हूं)।

ये क्यों हो रहा है? मैं सिर्फ एक सामान्य इंट कैसे प्राप्त करूं? (अगर किसी के पास एक त्वरित प्राइमर है, तो मुझे विभिन्न इंट प्रकारों का उपयोग क्यों करना चाहिए, यह बहुत बढ़िया होगा!)

संपादित करें: मैं int64 का उपयोग करके सामान्य सामान्य में परिवर्तित कर सकता हूं int([i64_var])। लेकिन मुझे अभी तक समझ में नहीं आया है कि ParseInt()जब मैं 0 का बिटसाइज़ करने का अनुरोध कर रहा हूं, तो मुझे इंटि 64 क्यों दे रहा है।


2
संक्षिप्तता के लिए Atoi का उपयोग करें ? भी, क्या आपका ParseInt फ़ंक्शन एक त्रुटि लौटा रहा है?
मैट

2
ठीक है, अब मैं थोड़ा उलझन में हूं। अगर मैं अटोई () का उपयोग करता हूं, तो यह मुझे एक इंट देता है, और सब कुछ काम करता है। मैं फोन कर रहा था parseInt(s, 0, 0), जिसे बेस 10 का पता लगाना चाहिए (क्योंकि स्ट्रिंग में आधार उपसर्ग नहीं है)। हालाँकि, Atoi को parseIntw / 10. के बेस को कॉल करने के लिए शॉर्टहैंड किया जाता है। बेस पैरामीटर लौटे हुए प्रकार में अंतर क्यों करता है?
इसहाक डोंटेजे लिंडेल

बेस पैरामीटर यह निर्धारित करता है कि इनपुट स्ट्रिंग को कैसे पढ़ा जाता है। एक स्ट्रिंग "123" या "0xBEEFCAKE" या "1011101" या "0677" की तरह लग सकता है। जिनमें से सभी का एक अलग अर्थ है और एक अलग संख्यात्मक मान है। एक आधार मूल्य का 0मतलब है कि कोड यह पता लगाने की कोशिश करता है। लेकिन कभी-कभी यह संभव नहीं होता है। 11(दशमलव) बनाम 11(बाइनरी) पूरी तरह से विभिन्न मूल्यों का प्रतिनिधित्व करते हैं।
jimt

1
ठीक है, मुझे लगता है कि मैं वास्तव में उलझन में हूँ जो डॉक्स है। Atoi के लिए डॉक्स केवल इतना ही कहते हैं कि यह केवल "आशुलिपि के लिए parseInt(s, 10, 0)" है। लेकिन फिर क्यों Atoi वापस लौटने intजबकि parseIntint64?
इसहाक डोंटेजे लिंडेल

1
ठीक से पता नहीं क्यों, मैं मान लूंगा कि Atoiबस ऐसे लोगों को समायोजित करने के लिए जोड़ा गया था जो C API से अधिक परिचित हैं:int atoi ( const char * str );
jimt

जवाबों:


55
func ParseInt(s string, base int, bitSize int) (i int64, err error)

ParseInt हमेशा लौटता है int64

bitSizeमूल्यों की सीमा को परिभाषित करता है। यदि दिए गए आकार से संबंधित मान को किसी दिए गए आकार के हस्ताक्षरित पूर्णांक द्वारा दर्शाया नहीं जा सकता है, तो इर = इर्रेंज।

http://golang.org/pkg/strconv/#ParseInt

type int int

int एक हस्ताक्षरित पूर्णांक प्रकार है जो आकार में कम से कम 32 बिट्स है। हालांकि, यह एक अलग प्रकार है, और इसके लिए एक उपनाम नहीं है, कहते हैं, इंट 32।

http://golang.org/pkg/builtin/#int

तो intभविष्य में 32 बिट से बड़ा हो सकता है या कुछ सिस्टम में जैसे intसी।

मुझे लगता है कि कुछ सिस्टम int64इससे तेज हो सकते हैं int32क्योंकि यह सिस्टम केवल 64 बिट पूर्णांक के साथ काम करता है।

यहाँ त्रुटि का उदाहरण है जब bitSize8 है

http://play.golang.org/p/_osjMqL6Nj

package main

import (
    "fmt"
    "strconv"
)

func main() {
    i, err := strconv.ParseInt("123456", 10, 8)
    fmt.Println(i, err)
}

22
अभ्यास में, जाओ आमतौर पर उपयोग करता है int64के लिए intएक amd64 GOARCH पर और int32के लिए int32-बिट GOARCHes पर। कम से कम डिफ़ॉल्ट कंपाइलर के साथ, मैं gccgo के बारे में निश्चित नहीं हूं। इसलिए " int32 बिट से बड़ा हो सकता है ..." केवल अटकलें नहीं है, यह वास्तव में होने की संभावना है क्योंकि 64-बिट संकलन लक्ष्यों को आमतौर पर गो में मुख्य शाखा माना जाता है।
लिनियरजेट्रोपे

12
"व्यवहार में, गो आम तौर पर एक amd64 [..] पर int के लिए int64 का उपयोग करता है -" अधिक सटीक, int हमेशा प्रोसेसर बिट-आकार के बराबर होता है । तो 64 बिट सिस्टम पर, यह 64 बिट है, 32 बिट सिस्टम पर, यह 32 बिट है। मुझे लगता है कि यह या तो int32 का एक उपनाम है या int64 आपके संकलन लक्ष्य पर निर्भर करता है (भले ही इसे एक उपनाम के रूप में लागू नहीं किया जाता है, कोई फर्क नहीं पड़ता)।
zupa

@zupa "int हमेशा प्रोसेसर बिट-साइज के बराबर होता है" के लिए स्रोत / संदर्भ क्या है?
कपड़

29

पैकेज strconv

func ParseInt

func ParseInt(s string, base int, bitSize int) (i int64, err error)

ParseInt दिए गए आधार (2 से 36) में एक स्ट्रिंग s की व्याख्या करता है और इसी मान i को लौटाता है। यदि आधार == 0, आधार को स्ट्रिंग के उपसर्ग द्वारा निहित किया गया है: बेस 16 "0x" के लिए, बेस 8 "0" के लिए, और बेस 10 अन्यथा।

बिटसाइज़ तर्क पूर्णांक प्रकार को निर्दिष्ट करता है जो परिणाम में फिट होना चाहिए। बिट आकार 0, 8, 16, 32, और 64 int, int8, int16, int32 और int64 के अनुरूप हैं।

ParseInt रिटर्न में जो त्रुटियां हैं, उनके ठोस प्रकार * NumError हैं और इसमें गलत। नं = s है। यदि s खाली है या उसमें अमान्य अंक हैं, तो इर। = ErrSyntax; यदि दिए गए आकार के अनुरूप मूल्य को किसी दिए गए आकार के हस्ताक्षरित पूर्णांक द्वारा दर्शाया नहीं जा सकता है, तो इर = इर्रेंज।

ParseIntहमेशा एक int64मूल्य देता है । पर निर्भर करता है bitSize, यह मान में फिट होगा int, int8, int16, int32, या int64। यदि मान द्वारा दिए गए आकार के एक हस्ताक्षरित पूर्णांक द्वारा प्रतिनिधित्व नहीं किया जा सकता है bitSize, तो err.Err = ErrRange

गो प्रोग्रामिंग भाषा विशिष्टता

संख्यात्मक प्रकार

एन-बिट पूर्णांक का मान एन बिट्स चौड़ा है और दो पूरक अंकगणित का उपयोग करके दर्शाया गया है।

int8        the set of all signed  8-bit integers (-128 to 127)
int16       the set of all signed 16-bit integers (-32768 to 32767)
int32       the set of all signed 32-bit integers (-2147483648 to 2147483647)
int64       the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)

कार्यान्वयन-विशिष्ट आकारों के साथ पूर्ववर्ती संख्यात्मक प्रकारों का एक सेट भी है:

uint     either 32 or 64 bits
int      same size as uint

intकार्यान्वयन के आधार पर, 32 या 64 बिट्स है। आमतौर पर यह 32-बिट कंपाइलर के लिए 32 बिट्स और 64-बिट कंपाइलर्स के लिए 64 बिट्स है।

intया uint, के आकार का पता लगाने के लिए उपयोग करें strconv.IntSize

पैकेज strconv

स्थिरांक

const IntSize = intSize

IntSizeएक बिट intया uintमान के आकार में है ।

उदाहरण के लिए,

package main

import (
    "fmt"
    "runtime"
    "strconv"
)

func main() {
    fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS)
    fmt.Println(strconv.IntSize)
}

आउटपुट:

gc amd64 linux
64

7

strconv.ParseIntऔर मित्र एपीआई को साफ और सरल रखने के लिए 64-बिट संस्करण लौटाते हैं। प्रत्येक को प्रत्येक संभावित रिटर्न प्रकार के लिए अलग संस्करण बनाना होगा। या interface{}फिर वापसी , जो तब एक प्रकार के दावे से गुजरना होगा। जिनमें से कोई भी आदर्श नहीं है।

int64चुना जाता है, क्योंकि यह किसी भी पूर्णांक आकार को, और समर्थित 64-बिट्स को शामिल कर सकता है। बिट आकार जो आप फ़ंक्शन में पास करते हैं, यह सुनिश्चित करता है कि मूल्य सही सीमा तक ठीक से जकड़ा हुआ है। तो आप बस लौटे मूल्य पर एक प्रकार का रूपांतरण कर सकते हैं, इसे जो भी पूर्णांक प्रकार की आवश्यकता हो, उसे चालू करने के लिए।

के बीच अंतर के लिए intऔर int64, यह वास्तुकला पर निर्भर है। intकेवल 32-बिट या 64-बिट पूर्णांक के लिए एक उपनाम है, जिस वास्तुकला के लिए आप संकलन कर रहे हैं।

समझदार आंख के लिए: लौटाया गया मूल्य एक हस्ताक्षरित पूर्णांक है। strconv.ParseUintअहस्ताक्षरित पूर्णांकों के लिए एक अलग फ़ंक्शन होता है, जो वापस लौटता है uint64और ऊपर बताए अनुसार उसी तर्क का पालन करता है।


4
अब तक जो मैंने देखा है, यह लगभग सही है, सिवाय इसके कि मुझे नहीं लगता कि intयह केवल एक उपनाम है - यह वास्तव में एक अलग प्रकार है। golang.org/pkg/builtin/#int
आइजैक

वास्तव में। गो वास्तव में अलियासिंग टाइप नहीं करता है। type int int32एक अनोखी और अलग तरह की चीज के रूप में व्यवहार किया जाना है। विशेष रूप से क्योंकि यह नई कार्यप्रणाली को intनए तरीकों के आवेदन के माध्यम से प्रकार के लिए परिभाषित करने की अनुमति देता है ।
jimt

5

आपके उद्देश्यों के लिए, strconv.Atoi()मुझे लगता है कि अधिक सुविधाजनक होगा।

अन्य उत्तर intप्रकार की व्याख्या करने के बारे में बहुत विस्तृत हैं , लेकिन मुझे लगता है कि गो भाषा विनिर्देश की एक कड़ी यहाँ दी गई है: http://golang.org/ref/spec#Numeric_types


0

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

type CustomInt64 int64

उपर्युक्त घोषणा में, CustomInt64 और अंतर्निहित int64 दो अलग-अलग डेटा प्रकार हैं और इन्टरचेंज का उपयोग नहीं किया जा सकता है।

वही int, int32 और int64 के मामले में है, ये सभी अलग-अलग डेटा प्रकार हैं जिनका उपयोग परस्पर विनिमय नहीं किया जा सकता है। जहाँ int32 32 पूर्णांक प्रकार है, int64 64 बिट्स है और सामान्य int प्रकार का आकार प्लेटफ़ॉर्म निर्भर है। यह 32-बिट सिस्टम पर 32-बिट्स और 64-बिट सिस्टम पर 64-बिट्स चौड़ा है। इसलिए हमें जेनेटिक डेटा प्रकार जैसे कि इंट, यूइंट और फ्लोट को निर्दिष्ट करते समय सावधान और विशिष्ट होना चाहिए। यह कोड में कहीं समस्या पैदा कर सकता है और एक अलग प्लेटफॉर्म पर एप्लिकेशन को क्रैश कर देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.