我有一个包含整数的字符串(已从文件中读取)。
我正在尝试使用 strconv 将字符串
转换为 int
。ParseInt()
.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。
<代码>strconv。ParseInt和朋友返回64位版本,以保持API的干净和简单。否则,必须为每个可能的返回类型创建单独的版本。或者返回<code>接口{}</code>,然后必须经过类型断言。这些都不是理想的。
选择 int64
,因为它可以容纳任何整数大小,最多可以容纳支持的 64 位,包括支持的 64 位。传递到函数中的位大小可确保将值正确钳位到正确的范围内。因此,您可以简单地对返回值进行类型转换,将其转换为所需的任何整数类型。
至于int
和int64int
只是32位或64位整数的别名,具体取决于编译的体系结构。
对于挑剔的眼睛:返回值是一个有符号整数。有一个单独的strconv。用于
无符号整数的 ParseUint 函数,它返回 uint64
并遵循与上面解释的相同的推理。
包strconv
函数分析int
func ParseInt(s string, base int, bitSize int) (i int64, err error)
ParseInt解释给定基数(2到36)的字符串s,并返回相应的值I。如果base == 0,则该基数由字符串的前缀表示:base 16表示“0x”,base 8表示“0”,否则base 10。
bitSize 参数指定结果必须适合的整数类型。位大小 0、8、16、32 和 64 对应于 int、int8、int16、int32 和 int64。
ParseInt 返回的错误具有具体类型 *NumError 并包含 err。数字 = s。如果 s 为空或包含无效数字,则 err。Err = 错误语法;如果对应于 S 的值不能用给定大小的有符号整数表示,则 err。Err = ErrRange。
ParseInt
始终返回一个 int64
值。根据 bitSize
,此值将适合 int
、int8
、int16
、int32
或 int64
。如果该值不能用 bitSize
给出的大小的有符号整数表示,则 err。Err = ErrRange
。
Go 编程语言规范
数字类型
n位整数的值为n位宽,并使用2的补码算术表示。
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 位。
要查找<code>int</code>或<code>uint</code>的大小,请使用<code>strconv.IntSize</code>。
包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
func ParseInt(s string, base int, bitSize int) (i int64, err error)
ParseInt
始终返回int64
。
< code>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)
}
本文向大家介绍int和Integer有什么区别?相关面试题,主要包含被问及int和Integer有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 考察点:数据类型 Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是I
问题内容: 例如,为什么可以这样做: 但不是: 你可以执行以下操作: 但不是: 问题答案: 是原始类型。类型的变量int存储要表示的整数的实际二进制值。没有意义,因为int它不是类,因此没有任何方法。 是一个类,与Java语言中的其他类没有什么不同。类型变量存储对对象的引用,就像存储任何其他引用(对象)类型一样。是对类的静态方法的调用(请注意,此方法实际上返回而不是)。 更具体地说,是一个具有单个
问题内容: 在你可以存储,,但它是从不同的。它们存在的原因是什么,如何使用它们? 问题答案: 根据Swift文档 整数 在大多数情况下,您无需选择特定大小的整数即可在代码中使用。Swift提供了另一个整数类型Int,其大小与当前平台的本机字大小相同: 在32位平台上,Int与Int32的大小相同。 在64位平台上,Int与Int64相同。 除非您需要使用特定大小的整数,否则在代码中始终将Int用作
VSCode 对两个类 self.save_data.prop 的类型推断结果: int* | str* 和 int | str 有什么区别,多出来的星号是什么意思?
问题内容: 当我遇到Joel Spolsky的时候,我正在阅读《更多关于软件的 Joel》,他说了一种有关特定类型的程序员的一些知识,他们知道Java / C#(面向对象编程语言)中an int和an 之间的区别Integer。 那么区别是什么呢? 问题答案: 在Java中, “ int”类型是原始类型,而“ Integer”类型是对象。 在C#中, 类型与值类型相同,并且是值类型(即更像Java
问题内容: 考虑以下基础: 任何人只能活在堆里 阵列IS-A 和 IS-A 我发现自己很难回答这样一个简单的问题: JVM和 JVM内部 有什么区别吗?还是仅在“编译时”才有意义? 问题答案: 运行时有所不同。 是原始int值的数组。是一个“对象”数组,其中包含对Integer对象的引用。 最重要的实际差异:无法持有价值观。 但是我仍然很困惑:是否仅存储原始值?如果是这样,这是否意味着原始类型可以