使用特定数字类型相对于另一个数字类型的含义是什么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用特定数字类型相对于另一个数字类型的含义是什么相关的知识,希望对你有一定的参考价值。

将整数存储为特定数字类型(uint8,int16,uint32,int64等)的内存含义是什么?我知道每种类型可以采用的整数范围,但是有一些内存效率可以通过使用适当的类型来实现吗?

例如,在Golang中,将某人的年龄存储为uint8而不是单位(根据其规范https://golang.org/ref/spec#Numeric_types相当于uint32或uint64)“似乎”效率更高。

答案

固定大小整数

固定大小的整数需要精确的内存量。对于单个变量,使用较小的整数类型“此处和那里”,如果有的话,您将只获得少量内存。此外,当用作结构字段的类型时,由于隐式填充,您再次可能无法获得任何结果。

当使用固定大小的整数作为(大)切片或数组的元素类型时,内存增益可能会很明显且相当大。

使用固定大小整数的另一个(可能更重要的)原因可能是传达您存储在其中的内容。您也可以使用int32int64类型来存储字节,但显然是浪费,它们不会传达存储在其中的有效数据范围。

另一点是效率。您总是可以使用int64代替其他有符号整数类型,但在某些架构上执行int64上的操作可能需要多次注册操作,因此速度要慢得多。此外,rune类型(int32的别名)清楚地表明您打算将其用于unicode代码点。

另一点是一致性。如果你使用int32在一个地方建模,你应该坚持使用它并在任何地方使用相同的类型。这在Go中比在其他语言中更重要,因为Go的类型系统是严格的(比大多数其他语言更严格),这意味着如果你有int32类型的值,你不能将它分配给int64类型的变量,反之亦然没有明确的转换。

int与固定大小的整数

类型intuint不是固定的大小,但根据Spec: Numeric types:

uint     either 32 or 64 bits
int      same size as uint

当您使用int时,编译器可能会在针对不同体系结构时生成更优化的代码。通常int在针对32位体系结构时为32位,而在针对64位体系结构时为64位。这意味着int的大小将与目标体系结构的寄存器大小相匹配,因此可以使用单个寄存器操作有效地执行整数运算。例如,如果使用int64,则可能需要执行多个(寄存器)操作以在32位体系结构上执行单个整数操作。

我认为int是一个整数类型,用于以它看到的最佳方式描述和传递Go的运行时数据结构的某些部分或组件。例如,为了索引数组或切片,或描述它们的大小,int是使用的“自然”类型。

Spec: Length and capactiy:

内置函数lencap接受各种类型的参数并返回int类型的结果。该实现保证结果始终适合int。例如索引切片或数组,或描述它们的长度和容量,int是推荐或强制执行的“自然”类型。

当在数组,切片或for range值上使用至少一个迭代变量的string语句时,迭代变量(“索引”)将为int类型。

另请注意,Rob Pike为Go 2提出了一项建议,将int更改为任意精度。 proposal: spec: change int to be arbitrary precision

另一答案

1)固定大小的整数可用于减少应用程序使用的内存。例如,在3D应用程序中使用float32而不是float64更有意义,因为显卡无论如何都需要float32s并且例如使用uint16而不是uint32作为绘制索引。

也就是说,对于单个变量,它没有区别,只有当你有大量的值并且可以交换内存的精度时。

2)写入磁盘时,例如使用encoding/binary包,你不能使用intuint,因为它们的大小在操作系统之间变化。您必须使用已知大小的值才能使文件格式明确无误。

3)当与操作系统的API接口时,通常需要使用固定大小的变量。例如,Windows API是一个32位API,这意味着当您加载Windows DLL时,您经常需要使用32位无符号整数作为标志等。

以上是关于使用特定数字类型相对于另一个数字类型的含义是什么的主要内容,如果未能解决你的问题,请参考以下文章

如何用sql查询某值类型字段各个记录中含有的特定数字?

pythonre字符串为特定字符和数字组成

②java基础——标识符关键字和基础数据类型

Java之数字处理类浅析

为特定的 ASBD 缓冲区获取正确的数字数据类型转换

少用数字来作为参数标识含义