跳到主要内容

Go 整数和浮点数类型

整数类型

Go 语言支持多种有符号和无符号的整数类型,包括 intuint 以及特定位宽的整数类型 int8int16int32int64uint8uint16uint32uint64

intuint 的大小取决于系统架构,在 32 位系统上为 32 位,在 64 位系统上为 64 位。

byteuint8 的别名,常用于表示二进制数据。

runeint32 的别名,表示一个 Unicode 码点。

我总结了各种整数类型的位宽和取值范围:

类型位宽范围说明
int88-bit-128 到 127有符号 8 位整数
uint88-bit0 到 255无符号 8 位整数,亦称 byte
int1616-bit-32768 到 32767有符号 16 位整数
uint1616-bit0 到 65535无符号 16 位整数
int3232-bit-2147483648 到 2147483647有符号 32 位整数,亦称 rune
uint3232-bit0 到 4294967295无符号 32 位整数
int6464-bit-9223372036854775808 到 9223372036854775807有符号 64 位整数
uint6464-bit0 到 18446744073709551615无符号 64 位整数
int平台相关-2147483648 到 2147483647(32 位)或 -9223372036854775808 到 9223372036854775807(64 位)有符号整数,位宽依赖于平台(32/64 位)
uint平台相关0 到 4294967295(32 位)或 0 到 18446744073709551615(64 位)无符号整数,位宽依赖于平台(32/64 位)
uintptr平台相关足以存储指针的无符号整数通常用于底层编程,如系统调用或 cgo

在编程中,我会根据需求选择合适的整数类型,既要满足数值范围,又要考虑内存占用。

浮点数类型

Go 语言提供了两种精度的浮点数类型 float32float64

float32 是 32 位浮点数,精度约为 7 位小数。

float64 是 64 位浮点数,精度约为 15 位小数。

浮点数的取值范围如下:

类型位宽范围精度
float3232-bit±1.18×10-38 到 ±3.4×1038约 7 位小数
float6464-bit±2.23×10-308 到 ±1.8×10308约 15 位小数

在进行浮点数运算时,需要注意精度问题,尤其是在比较和相等测试时,可能会出现精度损失。

复数类型

Go 语言支持两种复数类型 complex64complex128,分别由 float32float64 的实部和虚部组成。

可以使用内置函数 complex 创建复数,例如:

c := complex(1.0, 2.0)

使用 realimag 函数获取复数的实部和虚部:

realPart := real(c)
imagPart := imag(c)

我经常在需要处理复数运算时使用这些函数,非常方便。

数值常量

在 Go 中,数值常量是高精度的,可以表示任意精度的数值,只有在被赋值给变量或用于计算时,才会被转换为特定的类型。

常量可以是无类型的,编译器会根据上下文推断其类型:

const largeNumber = 123456789012345678901234567890

var num int64 = largeNumber

运算符和数学库

Go 语言提供了基本的算术和比较运算符。

算术运算符包括 +-*/%(取模)。

比较运算符包括 ==!=><>=<=

通过 math 包,可以使用丰富的数学函数和常量,方便进行复杂的数学计算。例如:

  • 常量:math.Pi(圆周率)、math.E(自然常数)
  • 函数:math.Sinmath.Cosmath.Logmath.Sqrt

示例代码:

package main

import (
"fmt"
"math"
)

func main() {
fmt.Println("Pi 的值是", math.Pi)
fmt.Println("Sin(π/2) =", math.Sin(math.Pi/2))
}

数值转换

Go 语言中的数值类型转换需要显式指定,不能自动转换。例如:

var a int = 10
var b float64 = float64(a)

需要注意类型转换,避免类型不匹配的错误。

位运算

Go 语言支持以下位运算符:

  • 按位与 &
  • 按位或 |
  • 按位异或 ^
  • 位清除(AND NOT)&^
  • 左移 <<
  • 右移 >>

示例:

package main

import (
"fmt"
)

func main() {
var a uint = 60 // 0011 1100
var b uint = 13 // 0000 1101

fmt.Println("a & b =", a&b) // 0000 1100
fmt.Println("a | b =", a|b) // 0011 1101
fmt.Println("a ^ b =", a^b) // 0011 0001
fmt.Println("a << 2 =", a<<2) // 1111 0000
fmt.Println("a >> 2 =", a>>2) // 0000 1111
}

位运算在性能优化、权限控制等底层编程中非常有用 😊。