Go语言数值类型的有三种,分别是整型、浮点型和复数,在说具体类型前,先说一下有符合和无符号区别:
字节是计算机数据的基本单元,8个比特组成一个字节,有符合表示有正负之分,最高位代表符号,0表示正数,1表示负数,其余位代表数值;无符号表示全部位数都表示数值:
有符号正数的最大取值为:
0$*$$2^{7}$+1*$2^{6}$+1*$2^{5}$+1*$2^{4}$+1*$2^{3}$+1*$2^{2}$+1*$2^{1}$+1*$2^{0}$=$2^{7}$-1 = 127
有符号负数的最小取值为:
-(1$*$$2^{7}$+0*$2^{6}$+0*$2^{5}$+0*$2^{4}$+0*$2^{3}$+0*$2^{2}$+0*$2^{1}$+0*$2^{0}$)=-$2^{7}$ = -128
无符号正数的最大取值为:
1$*$$2^{7}$+1*$2^{6}$+1*$2^{5}$+1*$2^{4}$+1*$2^{3}$+1*$2^{2}$+1*$2^{1}$+1*$2^{0}$=$2^{8}$-1=255
无符号负数的最小取值为:
0$*$$2^{7}$+0*$2^{6}$+0*$2^{5}$+0*$2^{4}$+0*$2^{3}$+0*$2^{2}$+0*$2^{1}$+0*$2^{0}$=0
整型
整型是我们常说的整数(int),int开头的是有符合类型,uint开头的是无符号类型,后面的数字是组成类型的比特数,根据取值范围的不同可以分为下面部分:
类型 | 字节 | 范围 |
---|---|---|
int8 | 1 | [-$2^{7}$,$2^{7}$) |
int16 | 2 | [-$2^{15}$,$2^{15}$) |
int32 | 4 | [-$2^{31}$,$2^{31}$) |
int64 | 8 | [-$2^{63}$,$2^{63}$) |
uint8 | 1 | [0,$2^{8}$) |
uint16 | 2 | [0,$2^{16}$) |
uint32 | 4 | [0,$2^{32}$) |
uint64 | 8 | [0,$2^{64}$) |
下面打印字节大小
package main
import (
"fmt"
"unsafe"
)
func main() {
var a8 int8
var a16 int16
var a32 int32
var a64 int64
var ua8 uint8
var ua16 uint16
var ua32 uint32
var ua64 uint64
fmt.Println(unsafe.Sizeof(a8)) //1
fmt.Println(unsafe.Sizeof(a16)) //2
fmt.Println(unsafe.Sizeof(a32)) //4
fmt.Println(unsafe.Sizeof(a64)) //8
fmt.Println(unsafe.Sizeof(ua8)) //1
fmt.Println(unsafe.Sizeof(ua16)) //2
fmt.Println(unsafe.Sizeof(ua32)) //4
fmt.Println(unsafe.Sizeof(ua64)) //8
}
初始值:整型的初始值都是0
特殊类型:
- int和uint:他们对应的是CPU平台字长,在32为操作系统里是int32和uint32,在64为操作系统里是int64和uint64,但GO是强类型语言,不能直接使用,需要转换才行。事实上开发用的比较多的是int型。
- rune 类型和 int32 类型是等价的,通常用于表示一个 Unicode 码点。这两个名称可以互换使用。同样,byte 和 uint8 也是等价类型,byte 类型一般用于强调数值是一个原始的数据而不是一个小的整数
- uintptr是一种无符号整型,没有指定具体的bit大小单可以足以容纳指针,uintptr 类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。
特别强调:存储长度一样,数值上相同,不代表他们是同一类型的。如下面a和b不是同一类型:
type myint int
var a int = 20
var b myint =20
浮点型
浮点数即常说的带小数点的数(1.2,2.22),Go语言提供了float32(单精度)和float64(双精度)两种类型
浮点数能够表示的范围可以从很小到很巨大,这个极限值范围可以在math包中获取
- math.MaxFloat32表示float32的最大值,大约是3.4e38
- math.MaxFloat64大约是1.8e308
- 两个类型最小的非负值大约是1.4e-45和4.9e-324
- float32大约可以提供小数点后6位的精度,作为对比,float64可以提供小数点后15位的精度。通常情况应该优先选择float64,因此float32的精确度较低,在累积计算时误差扩散很快,而且float32能精确表达的最小正整数并不大,因为浮点数和整数的底层解释方式完全不同。
var x float32 = 2.25
var y float64 = 3.3333333333
fmt.Printf("%T,%f\n", x, x) // float32,2.250000
fmt.Printf("%T,%f\n", y, y) // float64,33.333333
fmt.Printf("%T,%.2f\n", y, y) // float64,33.33
fmt.Printf("%T,%.15f\n", y, y) // float64,3.333333333300000
复数
在计算机,复数是由了两个浮点数组成的,其中一个为实部(real),一个为虚部(imag)。
Go提供两种复数类型,complex64,complex128,分别有float32和float64构成,内置函数complex从指定的实部和虚部构建复数,内置函数real和imag用来获取复数的实部和虚部:
var x complex128 = complex(1, 2) // 1+2i
var y complex128 = complex(3, 4) // 3+4i
fmt.Println(x*y) // (-5+10i)
fmt.Println(real(x*y)) // -5
fmt.Println(imag(x*y)) // 10
有疑问加站长微信联系(非本文作者)