Skip to content

1.4 数据类型:整型、浮点型与复数型

1. 整型

Go 为整数提供 10 种具名类型:带符号、无符号的 8 / 16 / 32 / 64 位整数各一对,以及与实现相关的 intuint。全貌见下图(与语言规范一致;以当前官方文档为准)。

有符号与无符号

  • 名称含 u 的为无符号(如 uint8):只能表示非负整数。
  • 不含 u 的为有符号(如 int8):可表示负数。

int8uint8 为例:二者宽度均为 8 bit,共 2⁸ = 256 种位组合。

类型取值范围
uint80255
int8-128127

固定宽度与 int / uint

int8int16int32int64(及 uint8uint64)在类型名中写明了位宽,语义与目标平台无关

intuint 的位宽取决于编译目标平台(常见情况:32 位目标上多为 32 bit64 位目标上多为 64 bit)。因此:

  • 协议、文件格式、跨语言数据交换等需要固定宽度时,宜用 int32 / int64uint32 / uint64
  • 本地计数、切片下标、循环变量等,用 int 很自然,也与 len 等内置结果的常用类型一致。

整型字面量与进制

十进制最常用:

go
var num int = 10

整数还可写为二进制、八进制、十六进制字面量(浮点字面量不能用整型那套进制前缀表示「整个小数」,见下节)。

进制前缀示例(十进制值均为 12
二进制0b / 0B0b1100
八进制0o / 0O0o14
十六进制0x0xC

fmt.Printf 按不同进制打印同一数值:

go
package main

import (
	"fmt"
)

func main() {
	var num01 int = 0b1100
	var num02 int = 0o14
	var num03 int = 0xC

	fmt.Printf("二进制 %%b: %b → 十进制 %%d: %d\n", num01, num01)
	fmt.Printf("八进制 %%o: %o → 十进制 %%d: %d\n", num02, num02)
	fmt.Printf("十六进制 %%X: %X → 十进制 %%d: %d\n", num03, num03)
}
text
二进制 %b: 1100 → 十进制 %d: 12
八进制 %o: 14 → 十进制 %d: 12
十六进制 %X: C → 十进制 %d: 12

(格式串中的 %% 在输出中为单个 %,用于在屏幕上标出动词名;一般打印只需 %b%d 等。)

与整型相关的 fmt 动词(节选)

动词含义
%b二进制
%o八进制
%d十进制
%x / %X十六进制(小写 / 大写字母)
%c以 Unicode 字符形式输出(整数须为合法码点)
%q单引号括起的 Go 字符字面量形式
%UU+1234 形式的 Unicode

%f%e%E 等用于浮点数,见下一节。

2. 浮点型

浮点字面量由整数部分小数点 .小数部分(两侧可省略其一)组成;也可使用指数形式:在尾数后写 eE,再跟十进制指数。例如 3.7e-20.0373.7e+137

37.0 可写作 370.037 可写作 .037

注意: 浮点字面量只能用十进制数字书写,不能像整数那样用 0x / 0o / 0b 表示整个浮点数。形如 03.7 的写法仍表示十进制 3.7(前导 0 无八进制含义)。

float32float64

Go 提供 float32(常称单精度)与 float64(常称双精度),遵循 IEEE 754 二进制浮点格式。

float324 字节(32 bit),1 位符号、8 位指数、23 位尾数。

img

float648 字节(64 bit),1 位符号、11 位指数、52 位尾数。

img

有效数字与取值范围

十进制有效位数大致由尾数位数决定:

  • float32:约 6~7 位有效十进制数字。
  • float64:约 15~16 位有效十进制数字(双精度,勿与单精度混淆)。

数量级上可参考 math 包,例如 math.MaxFloat323.4e38math.MaxFloat641.8e308;正数可小至约 1.4e-45float32)与 4.9e-324float64)量级(含非正规数),连续逼近 0

精度示例:float32

例 1: 10000018float32 表示约为 1.0000018×10⁷,仍在约 7 位有效数字内,x+1x 可区分。

go
package main

import "fmt"

func main() {
	var x float32 = 10000018
	fmt.Println(x)
	fmt.Println(x + 1)
}
text
1.0000018e+07
1.0000019e+07

例 2: 数值更大时,float32 尾数不足以区分某些相邻整数,加法结果可能与数学预期不一致。

go
package main

import "fmt"

func main() {
	var a float32 = 100000182
	var b float32 = 100000187
	fmt.Println(a)
	fmt.Println(a + 5)
	fmt.Println(a+5 == b)
}
text
1.00000184e+08
1.0000019e+08
false

例 3: 在部分取值上会出现 x == x+1true 的情况(增量相对 x 过小,舍入后不变)。需要精确十进制整数计数时,应使用整型math/big,不宜依赖浮点相等比较。

3. 复数型

Go 内置两种复数类型,由实部虚部组成,虚部用虚数单位 i(即数学上的虚数单位,满足 i² = -1)书写。

类型说明
complex64实部、虚部均为 float32,共 8 字节。
complex128实部、虚部均为 float64,共 16 字节(默认无类型复数字面量的默认类型)。

字面量与内置函数

复数字面量把 i 写在虚部系数后面,实部与虚部均为浮点形式,例如 1+2i3.0 - 0.5i

内置函数 complexrealimag 用于构造与拆取实虚部(参数类型需匹配,如 complex128 对应 float64):

go
package main

import "fmt"

func main() {
	var c1 complex128 = 1 + 2i
	c2 := complex(3.0, 4.0)          // 与 3+4i 等价
	fmt.Println(c1, real(c1), imag(c1)) // (1+2i) 1 2
	fmt.Println(c2, real(c2), imag(c2))   // (3+4i) 3 4
}

complex64 需用 float32 构造,例如 complex(float32(1), float32(2)) 或保证字面量落在 complex64 上下文中。

运算与标准库

对复数可使用 +-*/ 等运算符。更高层的函数(如幂、三角函数)可使用标准库 math/cmplx,其接口以 complex128 为主。

参考文章:

https://www.zhihu.com/question/26022206