Confusion entourant la conversion de uint8 en int8
La conversion d'un uint8 en un int8 dans Go peut entraîner un comportement inattendu, comme souligné dans ce qui suit exemple :
package main
import (
"fmt"
)
func main() {
a := int8(0xfc) // Compile error: constant 252 overflows int8
}
Le code échoue avec une erreur de compilation car la constante 0xfc dépasse la plage de int8 (-128 à 127). Cependant, le code suivant se compile sans erreur :
package main
import (
"fmt"
)
func main() {
a := 0xfc
b := int8(a) // Ok
}
La différence réside dans l'ordre des opérations. Dans le premier exemple, la constante est convertie en int8 avant d'être affectée à a. Dans le deuxième exemple, a reçoit d'abord la valeur 0xfc, puis est converti en int8.
Selon la spécification du langage Go, les expressions constantes doivent être représentables par le type constant. Dans ce cas, 0xfc ne peut pas être représenté par int8, ce qui entraîne une erreur de compilation.
Cependant, lorsque la conversion est effectuée après l'affectation, la valeur de a (qui n'est plus une constante) est comprise dans la plage de int8, permettant à la conversion de réussir.
Pour des cas d'utilisation pratiques, considérons l'exemple suivant :
type Char byte
var c Char = '世' // Error: '世' has value 0x4e16, too large.
Ce code génère une erreur car la valeur de la constante '世' (0x4e16) dépasse la plage d'octets ( 0 à 255). Pour résoudre ce problème, on peut utiliser la technique suivante :
var c Char = Char('世') // Ok
Dans ce cas, '世' est d'abord attribué à un type d'octet puis converti en Char. Cela garantit que la valeur se situe dans la plage du type Char. Des techniques similaires peuvent être appliquées lors de la conversion d'octets en int32 en tenant compte du signe de la valeur résultante.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3