Kekeliruan Menukarkan uint8 kepada int8
Dalam Go, menukarkan integer 8-bit yang tidak ditandatangani (uint8) kepada integer 8-bit yang ditandatangani ( int8) boleh mengakibatkan ralat. Mari terokai sebabnya.
Pertimbangkan kod berikut:
<code class="go">package main import "fmt" func main() { a := int8(0xfc) // compile error fmt.Println(a) }</code>
Kod ini menimbulkan ralat masa kompilasi: "constant 252 overflows int8." Untuk memahami isu ini, kita perlu merujuk kepada peraturan ungkapan malar Go.
Menurut spesifikasi bahasa, ungkapan malar mesti sentiasa boleh diwakili oleh nilai jenis malar. Dalam kes ini, 0xfc terlalu besar untuk dimuatkan dalam int8, yang julatnya ialah -128 hingga 127.
Jika kita menangguhkan penukaran jenis, seperti yang ditunjukkan di bawah, kod tersebut akan disusun tanpa ralat:
<code class="go">package main import "fmt" func main() { a := 0xfc b := int8(a) // ok fmt.Println(b) }</code>
Ini berfungsi kerana 0xfc ditafsirkan sebagai literal integer sebelum ditukar kepada int8. Sebagai literal integer, ia boleh menyimpan nilai di luar julat int8, tetapi pengkompil menguatkuasakan semakan jenis semasa penukaran sebenar.
Beberapa mata tambahan mengenai penukaran integer dalam Go:
<code class="go">var b byte = 0xff i32 := int32(int8(b))</code>
Ini memastikan tanda bait asal dikekalkan.
Atas ialah kandungan terperinci Mengapakah menukar uint8 kepada int8 dalam Go menyebabkan ralat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!