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)
}
我的问题:

  • 这两种代码有什么区别吗
  • 为什么第一个会引发编译错误
  • 见:
  • 类型化常量的值必须始终由常量类型的值精确表示。以下常量表达式是非法的:

  • 见:
  • 并非所有整数值都可以适用于所有整数类型。可能会出现两个问题:该值可能太大,或者可能是赋给无符号整数类型的负值。例如,int8的范围为-128到127,因此该范围之外的常量永远不能分配给int8:
    类型的变量
    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
    值。

    So
    a:=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