乐趣区

关于golang:Go基础编程数值类型

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

非凡类型:

  1. int 和 uint: 他们对应的是 CPU 平台字常,在 32 为操作系统里是 int32 和 uint32, 在 64 为操作系统里是 int64 和 uint64,但 GO 是强类型语言,不能间接应用,须要转换才行。事实上开发用的比拟多的是 int 型。
  2. rune 类型和 int32 类型是等价的,通常用于示意一个 Unicode 码点。这两个名称能够调换应用。同样,byte 和 uint8 也是等价类型,byte 类型个别用于强调数值是一个原始的数据而不是一个小的整数
  3. uintptr: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
退出移动版