Verwirrung über die Konvertierung von uint8 in int8
Bei der Konvertierung eines uint8 (vorzeichenlose 8-Bit-Ganzzahl) in einen int8 (vorzeichenbehaftete 8-Bit-Ganzzahl). ), ist das Ergebnis möglicherweise nicht immer wie erwartet. In diesem Artikel werden die Unterschiede zwischen den folgenden beiden Ansätzen untersucht und erklärt, warum der erste einen Kompilierungsfehler auslöst:
<code class="go">a := int8(0xfc) // compile error // deferring type conversion a := 0xfc b := int8(a) </code>
Der Unterschied zwischen den Codes
Der Unterschied zwischen Die beiden Codes liegen in der Reihenfolge der Operationen:
Kompilierungsfehler im ersten Code
Der erste Code löst einen Kompilierungsfehler aus, da die Konstante 0xfc den Bereich des Typs int8 überschreitet. int8 kann Werte zwischen -128 und 127 darstellen, während 0xfc den Dezimalwert 252 hat, was diesen Bereich überschreitet. Gemäß der Go-Sprachspezifikation müssen konstante Ausdrücke immer genau durch Werte des konstanten Typs darstellbar sein.
Legale und illegale konstante Ausdrücke
Siehe https:// golang.org/ref/spec#Constant_expressions für eine detaillierte Erklärung der zulässigen und illegalen konstanten Ausdrücke. Der Blogbeitrag unter https://blog.golang.org/constants bietet zusätzliche Einblicke in die Einschränkungen von Ganzzahltypen und die Bedeutung der Typprüfung von Konstanten zum Erkennen von Fehlern.
Lösung des Konvertierungsproblems
Wenn Ihr Ziel darin besteht, ein Byte (das ein uint8 ist) in ein int32 umzuwandeln und dabei dessen Vorzeichen zu berücksichtigen, besteht die empfohlene Vorgehensweise darin, es zunächst in zu konvertieren ein int8 und dann zu einem int32:
<code class="go">var b byte = 0xff i32 := int32(int8(b)) // -1</code>
Das obige ist der detaillierte Inhalt vonWarum schlägt die Konvertierung von uint8 in int8 mit einer Konstante in Go fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!