"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que a conversão de `uint8` em `int8` no Go leva a um comportamento inesperado?

Por que a conversão de `uint8` em `int8` no Go leva a um comportamento inesperado?

Publicado em 23/12/2024
Navegar:321

Why Does Converting a `uint8` to an `int8` in Go Lead to Unexpected Behavior?

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.

Tutorial mais recente Mais>

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