尝试将 8 位二进制字符串转为字节(无符号)
strconv.ParseInt("11111000", 2, 8)
返回 127
strconv.ParseInt("11111000", 2, 16)
返回正确的数字 248
根据ParseInt
文档,8 代表 int8,从 -128 到 127。如果是这样,为什么返回值不是负数?
尝试将 8 位二进制字符串转为字节(无符号)
strconv.ParseInt("11111000", 2, 8)
返回 127
strconv.ParseInt("11111000", 2, 16)
返回正确的数字 248
根据ParseInt
文档,8 代表 int8,从 -128 到 127。如果是这样,为什么返回值不是负数?
您解析正符号整数,负符号整数以减号为前缀。对于无符号整数,解析为无符号。此外,始终检查错误。
例如,
package main
import (
"fmt"
"strconv"
)
func main() {
// +127
i, err := strconv.ParseInt("01111111", 2, 8)
if err != nil {
fmt.Println(err)
}
fmt.Println(i)
// -128
i, err = strconv.ParseInt("-10000000", 2, 8)
if err != nil {
fmt.Println(err)
}
fmt.Println(i)
// +248 out of range for int8
i, err = strconv.ParseInt("11111000", 2, 8)
if err != nil {
fmt.Println(err)
}
fmt.Println(i)
// unsigned 248 in range for uint8 (byte)
u, err := strconv.ParseUint("11111000", 2, 8)
if err != nil {
fmt.Println(err)
}
fmt.Println(u)
}
输出:
127
-128
strconv.ParseInt: parsing "11111000": value out of range
127
248
ParseInt
将太大的值限制为数据类型的最大值。如果您检查第二个返回值(错误代码),您会看到它返回了一个范围错误。