簡體   English   中英

Go中的int和int64有什么區別?

[英]What is the difference between int and int64 in Go?

我有一個包含整數的字符串(已從文件中讀取)。

我正在嘗試使用strconv.ParseInt()string轉換為int ParseInt要求我提供一個位大小(位大小 0、8、16、32 和 64 對應於 int、int8、int16、int32 和 int64)。

從文件中讀取的整數很小(即它應該適合正常的 int)。 但是,如果我傳遞 0 的位大小,我會得到int64類型的結果(可能是因為我在 64 位操作系統上運行)。

為什么會這樣? 我怎樣才能得到一個正常的int? (如果有人對我何時以及為什么應該使用不同的 int 類型有一個快速入門,那就太棒了!)

編輯:我可以使用int([i64_var])將 int64 轉換為普通 int。 但是我仍然不明白為什么ParseInt()在我請求位大小為 0 時給了我一個 int64。

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

ParseInt總是返回int64

bitSize定義值的范圍。

如果 s 對應的值不能用給定大小的有符號整數表示,則 err.Err = ErrRange。

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

type int int

int 是一個有符號整數類型,大小至少為 32 位。 然而,它是一種獨特的類型,而不是 int32 的別名。

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

因此int將來可能會大於 32 位,或者在某些系統上,例如 C 中的int

我猜在某些系統上int64可能比int32更快,因為該系統僅適用於 64 位整數。

以下是bitSize為 8 時的錯誤示例:

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

package main

import (
    "fmt"
    "strconv"
)

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

包 strconv

func ParseInt

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

ParseInt 解釋給定基數(2 到 36)中的字符串 s 並返回相應的值 i。 如果 base == 0,則字符串的前綴隱含了 base:base 16 表示“0x”,base 8 表示“0”,否則為 base 10。

bitSize 參數指定結果必須適合的整數類型。 位大小 0、8、16、32 和 64 對應於 int、int8、int16、int32 和 int64。

ParseInt 返回的錯誤具有具體類型 *NumError 並包括 err.Num = s。 如果 s 為空或包含無效數字,則 err.Err = ErrSyntax; 如果 s 對應的值不能用給定大小的有符號整數表示,則 err.Err = ErrRange。

ParseInt總是返回一個int64值。 根據bitSize ,此值將適合intint8int16int32int64 如果該值不能由bitSize給定大小的有符號整數表示,則err.Err = ErrRange

Go 編程語言規范

數值類型

n 位整數的值是 n 位寬,並使用二進制補碼算法表示。

 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 位。

要找出intuint的大小,請使用strconv.IntSize

包 strconv

常數

const IntSize = intSize

IntSizeintuint值的位大小。

例如,

package main

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

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

輸出:

gc amd64 linux
64

strconv.ParseInt和朋友們返回 64 位版本以保持 API 簡潔明了。 否則,必須為每種可能的返回類型創建單獨的版本。 或者返回interface{} ,然后必須通過類型斷言。 沒有一個是理想的。

選擇int64是因為它可以容納任何整數大小,最高(包括)支持的 64 位。 您傳遞給函數的位大小可確保將值正確限制在正確的范圍內。 因此,您可以簡單地對返回值進行類型轉換,將其轉換為您需要的任何整數類型。

至於intint64之間的區別,這取決於架構。 int只是 32 位或 64 位整數的別名,具體取決於您正在編譯的體系結構。

明眼人:返回值是有符號整數。 對於無符號整數,有一個單獨的strconv.ParseUint函數,它返回uint64並遵循與上述相同的推理。

出於您的目的,我認為strconv.Atoi()會更方便。

關於解釋int類型的其他答案非常詳盡,但我認為這里值得鏈接到 Go 語言規范:http: //golang.org/ref/spec#Numeric_types

int是 go 中默認的有符號類型:在 32 位機器上它需要 32 位(4 字節),在 64 位機器上需要 64 位(8 字節)。 參考- Ivo Balbaert 的路要走

在 Go 語言中,每種類型都被視為單獨的數據類型,不能與基本類型互換使用。 例如,

type CustomInt64 int64

在上述聲明中,CustomInt64 和內置 int64 是兩種獨立的數據類型,不能互換使用。

int、int32 和 int64 也是如此,所有這些都是不能互換使用的獨立數據類型。 int32 是 32 它的整數類型,int64 是 64 位,通用 int 類型的大小取決於平台。 它在 32 位系統上為 32 位寬,在 64 位系統上為 64 位寬。 因此,在指定 int、uint 和 float 等通用數據類型時,我們必須小心謹慎。 它可能會導致代碼中的某個地方出現問題,並使應用程序在不同的平台上崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM