Confusão ao redor da conversão de uint8 para int8
Converter um uint8 em um int8 no Go pode levar a um comportamento inesperado, conforme destacado a seguir exemplo:
package main
import (
"fmt"
)
func main() {
a := int8(0xfc) // Compile error: constant 252 overflows int8
}
O código falha com um erro em tempo de compilação porque a constante 0xfc excede o intervalo de int8 (-128 a 127). No entanto, o código a seguir é compilado sem erros:
package main
import (
"fmt"
)
func main() {
a := 0xfc
b := int8(a) // Ok
}
A diferença está na ordem das operações. No primeiro exemplo, a constante é convertida em int8 antes de ser atribuída a a. No segundo exemplo, primeiro é atribuído a a o valor 0xfc e depois convertido para int8.
De acordo com a especificação da linguagem Go, as expressões constantes devem ser representáveis pelo tipo constante. Neste caso, 0xfc não pode ser representado por int8, levando ao erro de compilação.
No entanto, quando a conversão é realizada após a atribuição, o valor de a (que não é mais uma constante) está dentro do intervalo de int8, permitindo que a conversão seja bem-sucedida.
Para casos de uso prático, considere o seguinte exemplo:
type Char byte
var c Char = '世' // Error: '世' has value 0x4e16, too large.
Este código gera um erro porque o valor da constante '世' (0x4e16) excede o intervalo de bytes ( 0 a 255). Para corrigir isso, pode-se usar a seguinte técnica:
var c Char = Char('世') // Ok
Neste caso, '世' é primeiro atribuído a um tipo de byte e depois convertido em Char. Isso garante que o valor esteja dentro do intervalo do tipo Char. Técnicas semelhantes podem ser aplicadas ao converter bytes para int32 com considerações para o sinal do valor resultante.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3