ZetCode

Golang int8 类型

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

本教程解释了如何在 Go 中使用 `int8` 内置类型。我们将通过实际操作 8 位整数的示例来涵盖类型基础知识。

`int8` 类型在 Go 中代表有符号的 8 位整数。它可以存储从 -128 到 127 的值。当内存效率很重要时,此类型很有用。

在 Go 中,`int8` 是几种具有特定大小的整数类型之一。使用合适大小的整数有助于优化程序的内存使用。

基本 int8 声明和初始化

使用 `int8` 的最简单方法是声明和初始化变量。此示例显示了 int8 类型的基本变量声明。
注意: int8 的默认值为 0。

basic_int8.go
package main

import "fmt"

func main() {

    var a int8 = 42
    var b int8 = -100
    c := int8(127) // Type conversion
    
    fmt.Println("a:", a)
    fmt.Println("b:", b)
    fmt.Println("c:", c)
    
    var zero int8
    fmt.Println("Zero value:", zero)
}

我们声明了三个具有不同值的 int8 变量。最后一个示例显示了 int8 的零值。类型转换用于创建变量 c。

与 int8 的算术运算

`int8` 类型支持标准的算术运算。此示例显示了 int8 值的加法、减法、乘法和除法。

arithmetic_int8.go
package main

import "fmt"

func main() {

    x := int8(100)
    y := int8(50)
    
    sum := x + y
    diff := x - y
    product := x * y
    quotient := x / y
    
    fmt.Println("Sum:", sum)
    fmt.Println("Difference:", diff)
    fmt.Println("Product:", product)
    fmt.Println("Quotient:", quotient)
    
    // Modulus operation
    remainder := x % 3
    fmt.Println("Remainder:", remainder)
}

所有算术运算都在 int8 范围内工作。编译器将在编译时捕获常量表达式的溢出。

处理 int8 溢出

由于 `int8` 的范围有限,可能会发生溢出。此示例演示了如何检测和处理潜在的溢出情况。

overflow_int8.go
package main

import (
    "fmt"
    "math"
)

func safeAdd(a, b int8) (int8, bool) {
    if b > 0 >> a > math.MaxInt8 - b {
        return 0, false
    }
    if b < 0 >> a < math.MinInt8 - b {
        return 0, false
    }
    return a + b, true
}

func main() {

    max := int8(127)
    result, ok := safeAdd(max, 1)
    if !ok {
        fmt.Println("Overflow detected!")
    } else {
        fmt.Println("Result:", result)
    }
    
    min := int8(-128)
    result, ok = safeAdd(min, -1)
    if !ok {
        fmt.Println("Underflow detected!")
    }
}

`safeAdd` 函数在执行加法之前会检查溢出。它返回一个布尔值,指示操作是否安全。

在数组和切片中使用 int8

`int8` 类型可用于数组和切片,以实现内存高效的集合。此示例显示了 int8 的数组和切片操作。

array_slice_int8.go
package main

import "fmt"

func main() {

    // Array of int8 values
    numbers := [5]int8{10, 20, 30, 40, 50}
    fmt.Println("Array:", numbers)
    
    // Slice of int8 values
    slice := []int8{1, 2, 3, 4, 5}
    fmt.Println("Original slice:", slice)
    
    // Append to slice
    slice = append(slice, 6, 7, 8)
    fmt.Println("After append:", slice)
    
    // Iterate over slice
    sum := int8(0)
    for _, num := range slice {
        sum += num
    }
    fmt.Println("Sum of slice:", sum)
}

int8 的数组和切片比具有较大整数类型的数组和切片占用的内存更少。该示例显示了创建、追加和迭代等基本操作。

函数参数和返回中的 int8

函数可以接受 `int8` 参数并返回 int8 值。此示例演示了 int8 类型的函数签名。

function_int8.go
package main

import "fmt"

func minMax(a, b int8) (int8, int8) {
    if a < b {
        return a, b
    }
    return b, a
}

func sumInt8s(nums ...int8) int8 {
    var total int8
    for _, num := range nums {
        total += num
    }
    return total
}

func main() {

    small, large := minMax(10, 5)
    fmt.Printf("Min: %d, Max: %d\n", small, large)
    
    total := sumInt8s(1, 2, 3, 4, 5)
    fmt.Println("Sum:", total)
    
    // Variadic function with slice
    numbers := []int8{10, 20, 30}
    total = sumInt8s(numbers...)
    fmt.Println("Slice sum:", total)
}

函数可以像处理其他任何类型一样处理 int8 值。该示例显示了具有 int8 的常规参数和可变参数函数。

来源

Go 语言规范

本教程通过声明、算术、溢出处理以及在集合中的使用示例,涵盖了 Go 中的 `int8` 类型。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面有十多年的经验。

列出所有 Golang 教程