ZetCode

Golang uint64 类型

最后修改时间 2025 年 5 月 8 日

本教程将讲解如何在 Go 中使用 `uint64` 内置类型。我们将通过实际示例介绍 uint64 的基础知识,以及如何处理大数字。

Go 中的 `uint64` 类型表示 64 位无符号整数。它可以存储从 0 到 18,446,744,073,709,551,615 的值。此类型对于处理非常大的正数非常有用。

在 Go 中,`uint64` 是数字类型家族的一部分。它的大小是 uint32 的两倍,为无符号整数计算提供了广泛的范围。

基本的 uint64 声明和初始化

使用 uint64 最简单的方法是声明和初始化变量。此示例展示了 uint64 变量的基本用法。
注意: uint64 值必须是正数或零。

basic_uint64.go
package main

import "fmt"

func main() {

    var a uint64 = 18446744073709551615 // Maximum uint64 value
    b := uint64(1000000000000)          // Type conversion
    
    fmt.Println("a:", a)
    fmt.Println("b:", b)
    
    // Operations
    sum := a + b
    fmt.Println("Sum:", sum)
    
    product := a * 2
    fmt.Println("Product:", product)
}

该示例展示了 uint64 的声明、初始化和基本算术运算。请注意最大值以及从整数字面量进行的类型转换。

处理大数字

uint64 非常适合处理非常大的数字。此示例演示了 uint64 进行大数运算的能力。

large_numbers.go
package main

import "fmt"

func main() {

    // Population calculations
    worldPopulation := uint64(8045311447)
    annualGrowth := uint64(80000000)
    
    projectedPopulation := worldPopulation + annualGrowth
    fmt.Println("Projected population:", projectedPopulation)
    
    // Distance calculations (in meters)
    earthToMoon := uint64(384400000)
    lightYear := uint64(9460730472580800)
    
    fmt.Println("Earth to Moon:", earthToMoon)
    fmt.Println("One light year:", lightYear)
}

该示例将 uint64 用于实际的大数场景。它在没有溢出的情况下处理人口和天文距离计算。

使用 uint64 进行位运算

由于其 64 位宽度,uint64 非常适合位操作。此示例展示了 uint64 的常见位运算。

bitwise_operations.go
package main

import "fmt"

func main() {

    var flags uint64 = 0
    
    // Set flags
    flags |= 1 << 0 // Set bit 0
    flags |= 1 << 63 // Set bit 63
    
    fmt.Printf("Flags: %064b\n", flags)
    
    // Check flag
    if flags & (1 << 63) != 0 {
        fmt.Println("Bit 63 is set")
    }
    
    // Clear flag
    flags &^= 1 << 0
    fmt.Printf("Flags after clear: %064b\n", flags)
}

该示例演示了在 uint64 中设置、检查和清除位。位运算是底层编程任务的基础。

uint64 的二进制和十六进制表示

uint64 值可以用不同的基数表示。此示例展示了如何处理二进制和十六进制的 uint64 字面量。

binary_hex.go
package main

import "fmt"

func main() {

    // Binary literal (base 2)
    bin := uint64(0b11110000111100001111000011110000)
    fmt.Printf("Binary: %d (0b%064b)\n", bin, bin)
    
    // Hexadecimal literal (base 16)
    hex := uint64(0xFFFFFFFFFFFFFFFF)
    fmt.Printf("Hexadecimal: %d (0x%016X)\n", hex, hex)
    
    // Convert between bases
    fromHex := uint64(0xDEADBEEF)
    fmt.Printf("0xDEADBEEF in decimal: %d\n", fromHex)
    
    fromBin := uint64(0b1010101010101010)
    fmt.Printf("0b1010101010101010 in decimal: %d\n", fromBin)
}

该示例展示了二进制和十六进制格式的 uint64 字面量。它还演示了不同数字基数之间的转换。

uint64 的溢出和下溢

理解 uint64 的边界至关重要。此示例演示了 uint64 的溢出和下溢行为。

overflow.go
package main

import "fmt"

func main() {

    max := uint64(18446744073709551615)
    fmt.Println("Max uint64:", max)
    
    // Overflow example
    overflow := max + 1
    fmt.Println("Overflow result:", overflow) // Wraps around to 0
    
    // Underflow example
    var zero uint64 = 0
    underflow := zero - 1
    fmt.Println("Underflow result:", underflow) // Wraps around to max
    
    // Safe operations
    if max > max - 1 {
        fmt.Println("Safe comparison works")
    }
}

该示例展示了 uint64 值超出其范围时会发生什么。它演示了回绕行为和安全比较技术。

来源

Go 语言规范

本教程通过声明、运算和边界情况的实际示例,涵盖了 Go 中的 `uint64` 类型。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自 2007 年起撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Golang 教程