为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
手掌心 2021-10-18 17:06:43
我发现 Go 中有不同的整数类型令人困惑。考虑到许多其他主要编程语言中不存在这些区别,定义这些不同类别的必要性是什么?int  int8  int16  int32  int64uint uint8 uint16 uint32 uint64 uintptr
查看完整描述

3 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

Go有两种类型:

  1. 依赖于体系结构的类型, 例如intuintuintptr。和

  2. 体系结构无关的类型int32int64

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

  • anint是默认的有符号类型:在 32 位机器上需要 32 位(4 字节),在 64 位机器上需要 64 位(8 字节);unsigned 也是如此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 个小数位。


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


查看完整回答
反对 回复 2021-10-18
?
倚天杖

TA贡献1828条经验 获得超3个赞

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


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


还有更多你没有列出的:


byte    alias for uint8

rune    alias for int32

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


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


选择整数变量位大小的“调色板”并没有用尽,大多数其他语言提供相同范围的整数类型。如果排除符号,则 Java 基本上具有相同的数量:


Java         Go

-------------------------

byte    =>   int8

short   =>   int16

int     =>   int32

long    =>   int64


查看完整回答
反对 回复 2021-10-18
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

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


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


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


在各种架构上,积分运算的成本可能会有很大差异。在某些机器上,添加 anint可能比添加C long(或int64来自Go 的an )成本更高。在其他机器上(可能是大多数机器),情况可能正好相反。和CPU缓存的考虑可能问题很多WRT性能。在某些情况下(例如,如果您有十亿大小的数组)数据大小很重要。最后,对于来自外部的二进制数据,大小、布局、对齐和字节顺序很重要。阅读有关序列化的信息。


查看完整回答
反对 回复 2021-10-18
  • 3 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信