Memahami Limpahan Malar Golang dengan uint64
Masalah:
Pertimbangkan kod Golang berikut:
<code class="go">userid := 12345 did := (userid & ^(0xFFFF << 48))</code>
Apabila cuba menyusun kod ini, ralat ditemui:
./xxxx.go:511: constant -18446462598732840961 overflows int
Analisis:
Inti isu ini terletak dalam pemalar yang tidak ditaip ^(0xFFFF << 48). Pemalar ini mewakili nilai yang sangat besar disebabkan oleh operasi anjakan. Apabila pemalar yang tidak ditaip ditukar kepada int disebabkan oleh operasi bitwise dengan userid, pengkompil menimbulkan ralat limpahan kerana pemalar melebihi nilai maksimum yang boleh diwakili oleh int.
Penyelesaian:
Untuk menyelesaikan isu ini, seseorang boleh secara eksplisit menghantar pemalar yang tidak ditaip kepada jenis yang boleh menampung magnitudnya yang besar. Sebagai contoh, seseorang boleh menggantikan ungkapan bermasalah dengan yang berikut:
<code class="go">did := (userid & (1<<48 - 1))</code>
Dalam ungkapan yang diubah suai ini, 1<<48 - 1 menghasilkan pemalar 0x0000ffffffffffff, yang boleh diwakili oleh jenis data int64. Sebagai alternatif, seseorang boleh menggunakan int64 secara eksplisit dalam kod untuk memastikan keserasian dengan kedua-dua seni bina 32-bit dan 64-bit:
<code class="go">func main() { const userID int64 = 12345 did := userID & (1<<48 - 1) println(did) }</code>
Dengan mematuhi cadangan ini, anda boleh mengendalikan limpahan berterusan di Golang dan mengekalkan kod dengan berkesan mudah alih merentas seni bina yang berbeza.
Atas ialah kandungan terperinci Mengapa Golang Melemparkan Ralat Limpahan Semasa Mengira Pemalar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!