Heim >Backend-Entwicklung >Golang >Warum verursacht die Konvertierung von uint8 in int8 in Go einen Fehler?

Warum verursacht die Konvertierung von uint8 in int8 in Go einen Fehler?

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 12:43:02300Durchsuche

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

Verwirrung Konvertieren von uint8 in int8

Konvertieren einer vorzeichenlosen 8-Bit-Ganzzahl (uint8) in eine vorzeichenbehaftete 8-Bit-Ganzzahl ( int8) kann zu einem Fehler führen. Lassen Sie uns herausfinden, warum.

Betrachten Sie den folgenden Code:

<code class="go">package main

import "fmt"

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

Dieser Code löst einen Fehler bei der Kompilierung aus: „Konstante 252 überläuft int8.“ Um dieses Problem zu verstehen, müssen wir uns auf die Regeln für konstante Ausdrücke von Go beziehen.

Gemäß der Sprachspezifikation müssen konstante Ausdrücke immer durch Werte des konstanten Typs darstellbar sein. In diesem Fall ist 0xfc zu groß, um in einen int8 zu passen, dessen Bereich zwischen -128 und 127 liegt.

Wenn wir die Typkonvertierung wie unten gezeigt verschieben, wird der Code ohne Fehler kompiliert:

<code class="go">package main

import "fmt"

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

Dies funktioniert, weil 0xfc als ganzzahliges Literal interpretiert wird, bevor es in ein int8 konvertiert wird. Als Integer-Literal kann es Werte außerhalb des Bereichs von int8 enthalten, aber der Compiler erzwingt die Typprüfung während der eigentlichen Konvertierung.

Einige zusätzliche Punkte zur Integer-Konvertierung in Go:

  • Nicht alle Ganzzahlwerte können in alle Ganzzahltypen passen. Beispielsweise kann int64 keine Werte enthalten, die größer als 9.223.372.036.854.775.807 sind.
  • Vorzeichenlose Ganzzahltypen (uint8, uint16 usw.) können keine negativen Werte enthalten.
  • Zum Konvertieren eines Bytes (ein Alias ​​für uint8) in Wenn Sie einen Ganzzahltyp mit Vorzeichen haben, können Sie das folgende Muster verwenden:
<code class="go">var b byte = 0xff
i32 := int32(int8(b))</code>

Dadurch wird sichergestellt, dass das Vorzeichen des ursprünglichen Bytes erhalten bleibt.

Das obige ist der detaillierte Inhalt vonWarum verursacht die Konvertierung von uint8 in int8 in Go einen Fehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn