为什么Go有几种不同的整数类型?

时间:2015-07-07 10:42:08

标签: types go integer

我觉得Go中有不同的整数类型让人感到困惑。考虑到许多其他主要编程语言中没有这些区别,有必要定义这些不同的类别吗?

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

4 个答案:

答案 0 :(得分:9)

Go有两种类型:

  1. 体系结构相关类型,例如intuintuintptr。和
  2. 架构无关类型,例如int32int64等。
  3. 依赖于体系结构的类型具有运行程序的机器的适当长度:

    • int是默认的签名类型:32位需要32位(4个字节) 位机和64位机器上的64位(8字节);同样适用于未签名的uint
    • uintptr是一个无符号整数,足以存储指针值。

    与体系结构无关的类型具有固定大小(以位为单位),以其名称表示:

    对于整数,范围为:

    int8 (-128 -> 127)
    int16 (-32768 -> 32767)
    int32 (− 2,147,483,648 -> 2,147,483,647)
    int64 (− 9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807)
    

    对于无符号整数

    uint8 (with alias byte, 0 -> 255)
    uint16 (0 -> 65,535)
    uint32 (0 -> 4,294,967,295)
    uint64 (0 -> 18,446,744,073,709,551,615)
    

    对于花车

    float32 (+- 1O-45 -> +- 3.4 * 1038 )
    (IEEE-754) float64 (+- 5 * 10-324 -> 1.7 * 10308 )
    

    int是整数类型,提供最快的处理速度。 整数的初始(默认)值为0,对于浮点数,这是0.0 float32可靠地精确到大约7个小数位,一个float64到大约15个小数位。

    由于浮标与==!=进行比较,因此无法获得完美的准确性!

答案 1 :(得分:7)

为什么Go有几种不同的类型?使用不同类型/种类的数据。

为什么Go有几种不同的整数类型?使用不同类型/种类的整数数据。

还有更多内容尚未列出:

byte    alias for uint8
rune    alias for int32

有符号和无符号之间的区别非常明显。在Java中没有无符号整数,我发现它比具有额外类型更容易混淆并且具有选择的便利性。在Java中编写与发送/接收无符号整数数据的其他系统互操作的应用程序只是令人讨厌。

关于位大小,您可以方便地选择最适合您的内存需求(或内存严格性),还可以限制变量所代表的值的可能范围。不会增加语言或程序的复杂性。

"调色板"选择整数变量的位大小并不是无所谓,大多数其他语言提供相同范围的整数类型。如果排除sign-ness,那么Java基本上具有相同的数量:

Java         Go
-------------------------
byte    =>   int8
short   =>   int16
int     =>   int32
long    =>   int64

答案 2 :(得分:4)

C99语言具有类似的分类<stdint.h>(C更细粒度,类型为int_fast32_t);拥有那么多整数类型对portability和效率很有用。

与C99&amp; amp; C ++可能足以让Go拥有这些类型。

您可能希望编写能够在嵌入式微控制器,平板电脑(32位ARM),便宜笔记本电脑(32位x86),更大型台式机(64位x86-64),服务器(也许还有PowerPC或64位)上高效运行的代码AARCH64 ARM)等等......你在某些操作系统上有各种编程模型或ABI(例如我的Linux桌面上的x86,x32,amd64)。

在各种架构上,整体操作的成本可能差异很大。在某些计算机上,添加int可能比添加 C long(或 Go 中的int64)更昂贵。在其他机器上(可能大多数),它可能正好相反。并且CPU cache考虑​​因素可能很重要。性能。在某些情况下(例如,如果你有数十亿大小的数组)数据大小很重要。最后,对于来自外部的二进制数据,大小,布局,对齐和endianness很重要。阅读serialization

答案 3 :(得分:3)

现有答案是正确的。让我提供一个不同的视角。

提出这个问题意味着你习惯了比Go更高级的语言。像Python这样的语言可以被视为提供具有无限精度的单个整数类型。这在内部并不正确,但在实践中,您可以编写代码,假设它是真的。

Go不是那种语言。正确的语言不提供具有无限精度的整数类型(math/big package中有一个可用)。相反,每个整数类型都有一个特定的大小,以及产生不适合该大小换行的整数的操作。所以,在Go中,uint32(0xffffffff) + uint32(1) == uint32(0)

Go以这种方式工作,因为结果代码通常更有效。它还允许Go程序员编写可以更有效地存储在内存中的结构类型。但是,它确实意味着使用大量编程的程序员必须意识到溢出的可能性。