Maison  >  Article  >  développement back-end  >  Pourquoi la conversion d'un uint8 en int8 dans Go provoque-t-elle une erreur ?

Pourquoi la conversion d'un uint8 en int8 dans Go provoque-t-elle une erreur ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 12:43:02150parcourir

Why does converting a uint8 to int8 in Go cause an error?

Confusion Conversion de uint8 en int8

Dans Go, conversion d'un entier non signé de 8 bits (uint8) en un entier signé de 8 bits ( int8) peut entraîner une erreur. Voyons pourquoi.

Considérez le code suivant :

<code class="go">package main

import "fmt"

func main() {
    a := int8(0xfc)  // compile error
    fmt.Println(a)
}</code>

Ce code génère une erreur de compilation : "constant 252 overflows int8". Pour comprendre ce problème, nous devons nous référer aux règles d'expression constante de Go.

Selon la spécification du langage, les expressions constantes doivent toujours être représentables par des valeurs de type constant. Dans ce cas, 0xfc est trop grand pour tenir dans un int8, dont la plage est de -128 à 127.

Si nous différons la conversion de type, comme indiqué ci-dessous, le code se compile sans erreurs :

<code class="go">package main

import "fmt"

func main() {
    a := 0xfc
    b := int8(a)  // ok
    fmt.Println(b)
}</code>

Cela fonctionne car 0xfc est interprété comme un littéral entier avant d'être converti en int8. En tant que littéral entier, il peut contenir des valeurs en dehors de la plage de int8, mais le compilateur applique la vérification de type lors de la conversion réelle.

Quelques points supplémentaires concernant la conversion d'entiers dans Go :

  • Toutes les valeurs entières ne peuvent pas correspondre à tous les types entiers. Par exemple, int64 ne peut pas contenir de valeurs supérieures à 9 223 372 036 854 775 807.
  • Les types entiers non signés (uint8, uint16, etc.) ne peuvent pas contenir de valeurs négatives.
  • Pour convertir un octet (un alias pour uint8) en un type entier signé, vous pouvez utiliser le modèle suivant :
<code class="go">var b byte = 0xff
i32 := int32(int8(b))</code>

Cela garantit que le signe de l'octet d'origine est conservé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn