"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi la conversion d'un « uint8 » en « int8 » dans Go entraîne-t-elle un comportement inattendu ?

Pourquoi la conversion d'un « uint8 » en « int8 » dans Go entraîne-t-elle un comportement inattendu ?

Publié le 2024-12-23
Parcourir:198

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

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.

Dernier tutoriel Plus>

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