Maison > développement back-end > Golang > le corps du texte

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

Barbara Streisand
Libérer: 2024-10-30 12:43:02
original
168 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!