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

Mor*_*a R 5 types integer go

我觉得Go中有不同的整数类型让人感到困惑.鉴于许多其他主要编程语言中没有这些区别,定义这些不同类别的必要性是什么?

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr
Run Code Online (Sandbox Code Playgroud)

End*_*imo 10

Go有两种类型:

  1. 架构依赖类型int,uint,uintptr.和
  2. 体系结构无关的类型int32,int64

依赖于体系结构的类型具有运行程序的机器的适当长度:

  • an 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)
Run Code Online (Sandbox Code Playgroud)

对于无符号整数:

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)
Run Code Online (Sandbox Code Playgroud)

对于花车:

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

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

由于浮子比较它们==或者!=必须非常小心地完成精确度是不可能的!


icz*_*cza 8

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

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

还有更多未列出的内容:

byte    alias for uint8
rune    alias for int32
Run Code Online (Sandbox Code Playgroud)

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

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

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

Java         Go
-------------------------
byte    =>   int8
short   =>   int16
int     =>   int32
long    =>   int64
Run Code Online (Sandbox Code Playgroud)


Bas*_*tch 5

C99语言具有类似的分类<stdint.h>(并且C的粒度更细,类型为int_fast32_t);具有许多整数类型对于可移植性和效率很有用。

与C99和C ++的兼容性可能足以成为Go具有这些类型的原因。

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

在各种体系结构上,集成操作的成本可能相差很大。在一些机器上增加一个int可能比增加了更为昂贵的Ç long(或int64围棋)。在其他机器(可能是大多数机器)上,情况可能恰恰相反。和CPU缓存的考虑可能问题很多WRT性能。在某些情况下(例如,如果您拥有十亿个数组),数据大小非常重要。最后,对于来自外部的二进制数据,大小,布局,对齐方式和字节顺序至关重要。了解有关序列化的信息


ian*_*ant 5

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

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

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

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