Verwirrung bei der Konvertierung von uint8 nach int8
Die Konvertierung von uint8 in int8 in Go kann zu unerwartetem Verhalten führen, wie im Folgenden hervorgehoben Beispiel:
package main
import (
"fmt"
)
func main() {
a := int8(0xfc) // Compile error: constant 252 overflows int8
}
Der Code schlägt mit einem Fehler bei der Kompilierung fehl, weil die Konstante 0xfc den Bereich von int8 (-128 bis 127) überschreitet. Der folgende Code lässt sich jedoch ohne Fehler kompilieren:
package main
import (
"fmt"
)
func main() {
a := 0xfc
b := int8(a) // Ok
}
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:
type Char byte
var c Char = '世' // Error: '世' has value 0x4e16, too large.
Dieser Code löst einen Fehler aus, weil der Wert der Konstante '世' (0x4e16) den Bytebereich überschreitet ( 0 bis 255). Um dies zu beheben, kann man die folgende Technik verwenden:
var c Char = Char('世') // Ok
In diesem Fall wird '世' zuerst zugewiesen einen Bytetyp und dann in Char konvertiert. 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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3