Rumah >pembangunan bahagian belakang >Golang >Mengapa Golang Melemparkan Ralat Limpahan Semasa Mengira Pemalar?

Mengapa Golang Melemparkan Ralat Limpahan Semasa Mengira Pemalar?

DDD
DDDasal
2024-10-29 19:05:02772semak imbas

Why Does Golang Throw an Overflow Error When Calculating Constants?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn