Skip to content

进制

在 Go 语言中,进制转换和表示是常见的操作,Go 支持常见的进制表示,包括二进制(binary)、八进制(octal)、十进制(decimal)和十六进制(hexadecimal)。每种进制都有特定的表示方法和用法。

1. 十进制(Decimal)

十进制是最常见的进制,也是默认的数值表示方式。它使用的是 0-9 的数字。

  • 示例:42(十进制)
go
package main
import "fmt"

func main() {
    num := 42  // 十进制
    fmt.Println(num)  // 输出: 42
}

2. 二进制(Binary)

二进制由 0 和 1 构成。在 Go 中,可以通过在数字前加上 0b0B 来表示二进制数。

  • 示例:0b101010(二进制表示)
go
package main
import "fmt"

func main() {
    num := 0b101010  // 二进制
    fmt.Println(num)  // 输出: 42
}

3. 八进制(Octal)

八进制使用 0-7 的数字。在 Go 中,八进制数以 0 开头(不带其他前缀),并且仅支持非负数。

  • 示例:052(八进制)
go
package main
import "fmt"

func main() {
    num := 052  // 八进制
    fmt.Println(num)  // 输出: 42
}

4. 十六进制(Hexadecimal)

十六进制使用 0-9 和 A-F 的数字,其中 A-F 表示 10 到 15 的值。Go 中的十六进制数前缀为 0x0X

  • 示例:0x2A(十六进制表示)
go
package main
import "fmt"

func main() {
    num := 0x2A  // 十六进制
    fmt.Println(num)  // 输出: 42
}

5. 进制转换

在 Go 中,除了直接表示不同进制数之外,常见的进制转换操作也可以使用内建函数来完成:

  • strconv.Itoa():将整数转换为字符串,结果是十进制表示。
  • strconv.FormatInt():将整数转换为指定进制的字符串。
  • strconv.ParseInt():将字符串解析为整数,并支持指定进制。

示例:进制转换

go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 十进制转为二进制、八进制、十六进制
	num := 42

	// 十进制转二进制
	fmt.Println(strconv.FormatInt(int64(num), 2))  // 输出: 101010

	// 十进制转八进制
	fmt.Println(strconv.FormatInt(int64(num), 8))  // 输出: 52

	// 十进制转十六进制
	fmt.Println(strconv.FormatInt(int64(num), 16)) // 输出: 2a

	// 字符串转整数
	str := "2a"
	hexNum, _ := strconv.ParseInt(str, 16, 0)  // 解析十六进制字符串
	fmt.Println(hexNum)  // 输出: 42
}

6. strconv

Go 的 strconv 包提供了一些非常有用的函数来处理数值与字符串之间的转换,包括不同进制的转换。

常用函数

  • strconv.Itoa():将整数转换为字符串,输出十进制表示。
  • strconv.Atoi():将字符串解析为整数,输入为十进制字符串。
  • strconv.FormatInt():将整数转换为指定进制的字符串。
  • strconv.ParseInt():将字符串解析为整数,支持指定进制。

代码示例

go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 十进制转二进制、八进制、十六进制
	num := 42
	fmt.Println(strconv.FormatInt(int64(num), 2))  // 输出: 101010
	fmt.Println(strconv.FormatInt(int64(num), 8))  // 输出: 52
	fmt.Println(strconv.FormatInt(int64(num), 16)) // 输出: 2a

	// 字符串转整数
	str := "101010"
	intVal, err := strconv.ParseInt(str, 2, 0) // 将二进制字符串转为整数
	if err != nil {
		fmt.Println("Error:", err)
	}
	fmt.Println(intVal)  // 输出: 42
}

7. 整数到浮点数的进制转换

对于浮点数,Go 也提供了进制转换,通常使用 strconv.FormatFloat() 来将浮点数转为字符串,或者使用 strconv.ParseFloat() 来将字符串解析为浮点数。

go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 将浮点数转换为十进制字符串
	f := 42.42
	str := strconv.FormatFloat(f, 'f', -1, 64)
	fmt.Println(str) // 输出: 42.42

	// 将字符串转换为浮点数
	str = "42.42"
	flo, err := strconv.ParseFloat(str, 64)
	if err != nil {
		fmt.Println("Error:", err)
	}
	fmt.Println(flo) // 输出: 42.42
}

总结

Go 语言通过标准的进制表示和转换机制(如 0b0x 前缀,strconv 包等)提供了强大的进制操作支持。了解和使用这些进制表示方法,有助于在处理数字时更加高效,特别是在进行低层次的计算、数据压缩、网络协议、硬件编程等场景中。