Go number

作者: JunChow520 | 来源:发表于2020-12-28 02:51 被阅读0次

    Go中数值类型可细分为整数、浮点数、复数三种,每种都具有不同的大小范围和正负支持。

    整数

    整型分为两大类

    • 按长度划分:int8、int16、int32、int64
    • 按符号划分:uint8、uint16、uint32、uint64
    Go整型 其它语言
    uint8 byte
    int16 short
    int64 long

    Go提供了有符号和无符号的整数类型,同时提供四种大小不同的整数类型。

    • 整数类型根据有无符号(符号位)可分为有符号整数和无符号的整数
    • 整数类型根据二进制bit位大小分为8bit、16bit、32bit、64bit四种

    取值范围

    • 有符号整数采用2的补码形式表示,最高bit位表示符号位,因此取值范围从 -2^(n-1) 到 2^(n-1)-1。
    • 无符号整数所有bit位都用于表示非负数,因此取值范围从 1 到 2^n-1。

    等价类型

    类型 等价类型 描述
    uint8 byte byte类型用于强调数值是一个原始的数据而非小整数,可用于存储单个字节。
    int32 rune 表示Unicode字符,一个Unicode码点。

    特殊整型

    intuint分别对应特定CPU平台的字长(机器字大小),大小范围在32bit64bit之间变化,实际开发中由于编译器和硬件不同而不同。

    类型 描述
    uint 32位操作系统上为uint32(4个字节),64位操作系统上为uint64(8个字节)。
    int 32位操作系统上为int32(4个字节),64位操作系统上为int64(8个字节)。
    uintptr 无符号整型,用于存放一个指针。

    进制转换

    • Golang中无法直接定义二进制数,只能通过进制转换来实现。
    • Linux权限数字采用的是八进制数,比如0777、0666...
    • 内存地址一般采用十六进制
    var i = 10
    fmt.Printf("binary i = %b\n", i)      //1010
    fmt.Printf("decimal i = %d\n", i)     //10
    fmt.Printf("octal i = %o\n", i)       //12
    fmt.Printf("hexadecimal i = %x\n", i) //a
    fmt.Printf("hexadecimal i = %X\n", i) //A
    fmt.Printf("type i = %T\n", i)        //int
    
    进制 名称 描述
    %b binary 二进制
    %d decimal 十进制
    %o octal 八进制
    %x hexadecimal 十六进制
    %T type 查看变量类型

    转换函数

    var x = 10
    i := int8(x)
    fmt.Printf("i = %d, type = %T\n", i, i) //i = 10, type = int8
    

    使用注意

    • 整型变量的零值为0,浮点型的零值为0.0。
    • 整型中int是计算最快的一种类型
    • 浮点型尽可能使用float64,因为math数学包中有关数学运算的函数均采用此类型。
    • Golang是强类型语言不会隐式转换,因此Golang禁止不同类型之间的混合使用,但允许常量之间的混合使用。

    字节长度

    • unsafe.Sizeof(varname)可获取变量占用的字节长度
    var i uint16 = 1
    fmt.Printf("i = %d, type = %T, size = %d\n", i, i, unsafe.Sizeof(i)) //i = 1, type = uint16, size = 2
    

    浮点数

    Golang提供了两种精度的浮点数分别为float32float64,它们的算术规范由IEEE754浮点数国际标准定义,IEEE754浮点数标准被现代CPU支持。

    • float32在内存分配中占用4字节用于存储,float64内存中会分配8字节用于存储。
    浮点数 = 符号位 + 指数位 + 尾数位
    
    • 存储过程中,浮点数的尾数部分可能会丢失,因而会造成精度损失。

    float32类型的浮点数可提供约6个十进制数的精度,float64类型的浮点数可提供约15个十进制数的精度。通常会优先选择使用float64,因为float32累计计算误差会比较容易扩散。

    f := 3.14159
    fmt.Printf("%T\n", f) //float64
    
    f32 := float32(f)
    fmt.Printf("%T\n", f32) //float32
    
    • float32不能直接转换为float64
    f = f32 // cannot use f32 (type float32) as type float64 in assignment
    
    • 浮点数的极限值可使用math包中的math.MaxFloat32math.MaxFloat64常量获取。
    fmt.Println(math.MaxFloat32) //3.4028234663852886e+38
    fmt.Println(math.MaxFloat64) //1.7976931348623157e+308
    
    • 浮点数声明时可只写整数部分或小数部分,不可省略小数点。
    • 较大或较小的浮点数可采用科学计数法通过eE来指定指数部分
    浮点型编码规范
    • 格式化输出浮点数时使用%f来控制保留小数位数

    复数

    计算机中复数(complex)由两个浮点数表示,一个表示实部(real)一个表示虚部(imag)。

    Go语言中复数的值由三部分组成RE + IMi,分别是实数部分RE、虚数部分IM、虚数单位iREIM均为float

    Go语言提供两种类型的复数,分别是complex64即32位实数和虚数,complex128即64位实数和虚数,complex128为复数的默认类型。

    复数声明

    var z complex128 = complex(x, y)
    

    z表示复数的变量名,complex128表示复数类型,complex()内置函数用于为复数赋值。xy分别表示构成该复数的两个float64类型的值,x为实部,y为虚部。

    简写形式

    z := complex(x, y)
    

    对于z值可通过内置函数real(z)获取该复数的实部,使用imag(z)获取虚部。

    相关文章

      网友评论

          本文标题:Go number

          本文链接:https://www.haomeiwen.com/subject/rwtznktx.html