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]
关键点:
byte是uint8的别名,范围0-255- Go字符串默认使用UTF-8编码
- 中文字符在UTF-8中通常需要3个字节表示
- 字节值可以合法地超过128,最高到255
如果您需要处理单个比特,应该使用位操作或专门的位数组结构,而不是字节切片。

