Go 关于将'uint8'转换为'int8'的混淆`
我想将Go 关于将'uint8'转换为'int8'的混淆`,go,Go,我想将uint8转换为int,因此我编写了一个常量0xfc,并尝试使用int8(0xfc)对其进行转换。但是,该代码会引发一个错误: 主程序包 进口( “fmt” ) func main(){ a:=int8(0xfc)//编译错误:常量252溢出int8 b:=a fmt.Println(b) } 但是如果我在赋值之后延迟类型转换,代码就可以解决这个问题 主程序包 进口( “fmt” ) func main(){ a:=0xfc b:=int8(a)//好的 fmt.Println(b) }
uint8
转换为int
,因此我编写了一个常量0xfc
,并尝试使用int8(0xfc)
对其进行转换。但是,该代码会引发一个错误:
主程序包
进口(
“fmt”
)
func main(){
a:=int8(0xfc)//编译错误:常量252溢出int8
b:=a
fmt.Println(b)
}
但是如果我在赋值之后延迟类型转换,代码就可以解决这个问题
主程序包
进口(
“fmt”
)
func main(){
a:=0xfc
b:=int8(a)//好的
fmt.Println(b)
}
我的问题:
- 这两种代码有什么区别吗
- 为什么第一个会引发编译错误
类型的变量
var i8 int8=128//错误:太大。
类似地,uint8(也称为byte)的范围为0到255,因此不能将大常量或负常量分配给uint8:
var u8 uint8=-1//错误:负值。
这种类型检查可以发现如下错误:
type Char byte
var c Char = '世' // Error: '世' has value 0x4e16, too large.
如果编译器抱怨您使用了常量,那么很可能是这样一个真正的错误
我的实际需求是在解析二进制文件时将
字节
转换为int32
。我可能会遇到常量字节0xfc
,在将其转换为int32
之前,应将其转换为int8
,并考虑符号
是的,这是一条路:
var b byte = 0xff
i32 := int32(int8(b))
fmt.Println(i32) // -1
这两种代码有什么区别吗
第一个示例使用了一个。第二种使用简单的表达方式。常量表达式在编译时使用与普通表达式不同的规则进行求值
为什么第一个会引发编译错误
int8(0xfc)
是一个类型化文件。类型化常量的值必须始终由常量类型的值精确表示。编译器报告错误,因为值252不能用int8
的值表示
根据对其他答案的评论,我认为目标是从带有符号扩展名的字节中获得
int32
。给定一个字节变量b
,使用表达式int32(int8(b))
获得带符号扩展名的int32
值。Soa:=int8(0xfc)
等于compile认为的var a int8=0xfc
,并且int8
不能保存252
的信息,那么compile会引发一个错误吗?是的,它等于vara int8=252
,int8的范围是-128到127,但您确实需要:vara int8=-4
int8(0xfc)
是一个类型化的。类型化常量的值必须始终由常量类型的值精确表示。值252不能用int8的值表示。@A.R我的实际要求是在解析二进制文件时将字节
转换为int32
。我可能会遇到常量字节0xfc
,在将其转换为int32
之前,应先将其转换为int8
,并考虑符号。因此var a int8=-4
可能不是我需要的。
var b byte = 0xff
i32 := int32(int8(b))
fmt.Println(i32) // -1