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

Posted

技术标签:

【中文标题】为啥 Go 有几种不同的整数类型?【英文标题】:Why does Go have several different integer types?为什么 Go 有几种不同的整数类型? 【发布时间】:2015-09-24 19:26:43 【问题描述】:

Go 中有不同的整数类型,这让我很困惑。鉴于许多其他主要编程语言中不存在这些区别,定义这些不同类别的必要性是什么?

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

与 C99 和 C++ 的兼容性可能足以成为 Go 拥有这些类型的理由。

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

在各种架构上,积分运算的成本可能相差很大。在某些机器上,添加 int 可能比添加 C long(或来自 Goint64)更昂贵。在其他机器(可能是大多数机器)上,情况可能正好相反。 CPU cache 考虑因素可能很重要。表现。在某些情况下(例如,如果你有十亿大小的数组)数据大小很重要。最后,对于来自外部的二进制数据,大小、布局、对齐和endianness 很重要。阅读serialization。

【讨论】:

那么,例如,缺少这些区别的 Python 的可移植性不如 Go? 这取决于它如何定义它们。 Python 的目标是表现力,而不是效率。 IIRC、Python 整数都是bigints【参考方案3】:

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

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

还有更多你没有列出的:

byte    alias for uint8
rune    alias for int32

有符号和无符号之间的区别非常明显。在 Java 中没有无符号整数,我发现它比拥有额外类型和方便选择更令人困惑。在 Java 中编写与发送/接收无符号整数数据的其他系统互操作的应用程序很烦人。

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

选择整数变量的位大小的“调色板”并不令人筋疲力尽,大多数其他语言都提供相同范围的整数类型。如果排除符号性,那么 Java 基本上是一样的:

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

【讨论】:

【参考方案4】:

Go 有两种类型:

    架构相关类型,例如intuintuintptr。和 架构独立类型,例如int32int64

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

int 是默认的有符号类型:它需要 32 位(4 字节)在 32 位机和 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 位。

由于浮点数与==!= 进行比较时不可能达到完美的准确性,因此必须非常小心!

【讨论】:

以上是关于为啥 Go 有几种不同的整数类型?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA四种整数数据类型的取值范围分别是多少

当某些列有几种不同的数据类型时,DynamoDB 表到 Hive?

oracle中啥是同义词,它有几种类型,不同类型同义词的区别是啥?并写出语法?

java真实面试_深圳百纳九州_java的基本数据类型有几种,并且写出全部的数据类型写出常用的Linux命令finalfinalize和finnally的不同之处用java手写一个单例类

js数据类型BigInt

为啥 Go 没有计算整数绝对值的函数?