Golang中如何表示大于128的位?

Golang中如何表示大于128的位?

func main() {
fmt.Println([]byte("世界"))
}

// 输出:[228 184 150 231 149 140]

有人能解释一下这里发生了什么吗?我以为每个值应该是一个比特,最大只能到128?

2 回复

每个值都是一个字节,字节的取值范围是0到255。

关于所有内容如何编码的更多信息可以在维基百科上阅读:https://en.wikipedia.org/wiki/UTF-8

更多关于Golang中如何表示大于128的位?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,[]byte 表示的是字节切片(byte slice),而不是比特(bit)切片。一个字节(byte)由8个比特组成,可以表示的范围是0到255(无符号8位整数),而不是最大到128。

在您的代码示例中:

fmt.Println([]byte("世界"))

输出 [228 184 150 231 149 140] 是因为字符串 "世界" 被转换为UTF-8编码的字节序列。UTF-8是一种变长编码,每个字符可能由1到4个字节表示。

具体解释:

  • 汉字 "世" 在UTF-8编码中对应3个字节:228, 184, 150
  • 汉字 "界" 在UTF-8编码中对应3个字节:231, 149, 140

这些值都大于128,因为UTF-8编码中,多字节字符的首字节通常大于等于194(0xC2),而后续字节在128到191之间。

验证示例:

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    s := "世界"
    fmt.Printf("字符串: %s\n", s)
    fmt.Printf("字节切片: %v\n", []byte(s))
    fmt.Printf("字符数: %d\n", utf8.RuneCountInString(s))
    
    // 逐个字符解码
    for len(s) > 0 {
        r, size := utf8.DecodeRuneInString(s)
        fmt.Printf("字符: %c, Unicode: U+%04X, 字节: %v\n", 
            r, r, []byte(s[:size]))
        s = s[size:]
    }
}

输出:

字符串: 世界
字节切片: [228 184 150 231 149 140]
字符数: 2
字符: 世, Unicode: U+4E16, 字节: [228 184 150]
字符: 界, Unicode: U+754C, 字节: [231 149 140]

关键点:

  1. byteuint8 的别名,范围0-255
  2. Go字符串默认使用UTF-8编码
  3. 中文字符在UTF-8中通常需要3个字节表示
  4. 字节值可以合法地超过128,最高到255

如果您需要处理单个比特,应该使用位操作或专门的位数组结构,而不是字节切片。

回到顶部