Go语言整型(整数类型) 图片看不了?点击切换HTTP 返回上层
Go语言的数值类型包括几种不同大小的整数、浮点数和复数。每种数值类型都决定了对应的大小范围和是否支持正负符号。本节我们主要介绍一下整数类型。
Go语言同时提供了有符号和无符号类型的整数运算。其中包括 int8、int16、int32 和 int64 四种截然不同大小的有符号整数类型,分别对应 8、16、32、64bit 大小的有符号整数,与此对应的是 uint8、uint16、uint32 和 uint64 四种无符号整数类型。
此外还有两种一般对应特定 CPU 平台机器字大小的有符号和无符号整数 int 和 uint;其中 int 是应用最广泛的数值类型。这两种类型都有同样的大小,32 或 64bit,但是我们不能对此做任何的假设;因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。
大多数情况下,我们只需要 int 一种整型即可,它可以用于循环计数器、数组、切片索引,以及任何通用目的的整型运算符,通常 int 类型的处理速度也是最快的。
Unicode 字符 rune 类型是和 int32 等价的类型,通常用于表示一个 Unicode 码点。这两个名称可以互换使用。同样 byte 也是 uint8 类型的等价类型,byte 类型一般用于强调数值是一个原始的数据而不是一个小的整数。
最后,还有一种无符号的整数类型 uintptr,没有指定具体的 bit 大小但是足以容纳指针。uintptr 类型只有在底层编程时才需要,特别是 Go语言和 C语言函数库或操作系统接口相交互的地方。
不管它们的具体大小,int、uint 和 uintptr 是不同类型的兄弟类型。其中 int 和 int32 也是不同的类型,即使 int 的大小也是 32bit,在需要将 int 当作 int32 类型的地方需要一个显式的类型转换操作,反之亦然。
其中有符号整数采用 2 的补码形式表示,也就是最高 bit 位用来表示符号位,一个 n-bit 的有符号数的值域是从 $-2^{n-1}$ 到 $2^{n-1}-1$。无符号整数的所有 bit 位都用于表示非负数,值域是 0 到 $2^n-1$。例如,int8 类型整数的值域是从 -128 到 127,而 uint8 类型整数的值域是从 0 到 255。
反之,在二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用 int 和 uint。
Go语言同时提供了有符号和无符号类型的整数运算。其中包括 int8、int16、int32 和 int64 四种截然不同大小的有符号整数类型,分别对应 8、16、32、64bit 大小的有符号整数,与此对应的是 uint8、uint16、uint32 和 uint64 四种无符号整数类型。
此外还有两种一般对应特定 CPU 平台机器字大小的有符号和无符号整数 int 和 uint;其中 int 是应用最广泛的数值类型。这两种类型都有同样的大小,32 或 64bit,但是我们不能对此做任何的假设;因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。
大多数情况下,我们只需要 int 一种整型即可,它可以用于循环计数器、数组、切片索引,以及任何通用目的的整型运算符,通常 int 类型的处理速度也是最快的。
Unicode 字符 rune 类型是和 int32 等价的类型,通常用于表示一个 Unicode 码点。这两个名称可以互换使用。同样 byte 也是 uint8 类型的等价类型,byte 类型一般用于强调数值是一个原始的数据而不是一个小的整数。
最后,还有一种无符号的整数类型 uintptr,没有指定具体的 bit 大小但是足以容纳指针。uintptr 类型只有在底层编程时才需要,特别是 Go语言和 C语言函数库或操作系统接口相交互的地方。
不管它们的具体大小,int、uint 和 uintptr 是不同类型的兄弟类型。其中 int 和 int32 也是不同的类型,即使 int 的大小也是 32bit,在需要将 int 当作 int32 类型的地方需要一个显式的类型转换操作,反之亦然。
其中有符号整数采用 2 的补码形式表示,也就是最高 bit 位用来表示符号位,一个 n-bit 的有符号数的值域是从 $-2^{n-1}$ 到 $2^{n-1}-1$。无符号整数的所有 bit 位都用于表示非负数,值域是 0 到 $2^n-1$。例如,int8 类型整数的值域是从 -128 到 127,而 uint8 类型整数的值域是从 0 到 255。
哪些情况下使用 int 和 uint
逻辑对整型范围没有特殊需求。例如,对象的长度使用内建 len() 函数返回,这个长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用 int 来表示。反之,在二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用 int 和 uint。