Verwirrung bei der Konvertierung von uint8 in int8
Die Konvertierung von uint8 in int8 in Go kann zu unerwartetem Verhalten führen, wie im Folgenden hervorgehoben wird Beispiel:
<code class="go">package main import ( "fmt" ) func main() { a := int8(0xfc) // Compile error: constant 252 overflows int8 }</code>
Der Code schlägt mit einem Fehler bei der Kompilierung fehl, da die Konstante 0xfc den Bereich von int8 (-128 bis 127) überschreitet. Der folgende Code lässt sich jedoch fehlerfrei kompilieren:
<code class="go">package main import ( "fmt" ) func main() { a := 0xfc b := int8(a) // Ok }</code>
Der Unterschied liegt in der Reihenfolge der Operationen. Im ersten Beispiel wird die Konstante in int8 konvertiert, bevor sie a zugewiesen wird. Im zweiten Beispiel wird a zunächst der Wert 0xfc zugewiesen und dann in int8 konvertiert.
Gemäß der Go-Sprachspezifikation müssen konstante Ausdrücke durch den konstanten Typ darstellbar sein. In diesem Fall kann 0xfc nicht durch int8 dargestellt werden, was zu einem Kompilierungsfehler führt.
Wenn die Konvertierung jedoch nach der Zuweisung durchgeführt wird, liegt der Wert von a (der keine Konstante mehr ist) im Bereich von int8, damit die Konvertierung erfolgreich ist.
Betrachten Sie für praktische Anwendungsfälle das folgende Beispiel:
<code class="go">type Char byte var c Char = '世' // Error: '世' has value 0x4e16, too large.</code>
Dieser Code löst einen Fehler aus, da der Wert der Konstante „世“ (0x4e16) überschreitet den Bytebereich (0 bis 255). Um dies zu beheben, kann man die folgende Technik verwenden:
<code class="go">var c Char = Char('世') // Ok</code>
In diesem Fall wird „世“ zunächst einem Bytetyp zugewiesen und dann in Char umgewandelt. Dadurch wird sichergestellt, dass der Wert im Bereich des Char-Typs liegt. Ähnliche Techniken können bei der Konvertierung von Bytes in int32 unter Berücksichtigung des Vorzeichens des resultierenden Werts angewendet werden.
Das obige ist der detaillierte Inhalt vonWarum führt die Konvertierung von „uint8' in „int8' in Go zu unerwartetem Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!