Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Kod Go Saya Mengalami Ralat Limpahan Apabila Menggunakan Pemalar?

Mengapa Kod Go Saya Mengalami Ralat Limpahan Apabila Menggunakan Pemalar?

Barbara Streisand
Barbara Streisandasal
2024-11-02 00:42:02625semak imbas

Why Does My Go Code Experience an Overflow Error When Using Constants?

Limpahan Malar Berlatarkan dalam Go

Apabila bekerja dengan pemalar dalam Go, adalah penting untuk memahami penukaran jenisnya untuk mengelakkan kemungkinan limpahan. Pertimbangkan coretan kod berikut:

<code class="go">const (
    userid = 12345
    did = (userid &^ (0xFFFF << 48))
)</code>

Menyusun kod ini menyebabkan ralat berikut:

constant -18446462598732840961 overflows int

Untuk menyelesaikan isu ini, kita perlu menyelidiki jenis penukaran asas yang Go lakukan dengan pemalar.

Memahami Pemalar Tidak Ditaip dan Penukaran Jenis

Dalam kod di atas, pemalar 0xFFFF << 48 ialah pemalar yang tidak ditaip, yang bermaksud ia tidak mempunyai jenis khusus yang diberikan kepadanya. Apabila menggabungkan pemalar yang tidak ditaip dengan nilai yang ditaip, pemalar yang tidak ditaip mengambil jenis operan yang lain.

Dalam kes kami, kami sedang menjalankan operasi DAN (&) antara id pengguna pemalar yang ditaip (iaitu int ) dan pemalar yang tidak ditaip 0xFFFF << 48. Oleh itu, ungkapan yang terhasil (userid &^ (0xFFFF << 48)) menjadi int.

Pemalar Integer Melimpah

Masalah timbul apabila kita menafikan pemalar yang tidak ditaip 0xFFFF << 48, menghasilkan -0xffff000000000001. Oleh kerana nilai ini terlalu besar untuk jenis int (yang ditandatangani dan mempunyai julat -2^31 hingga 2^31-1), ia menyebabkan ralat penyusunan.

Menggunakan Int64 untuk Mudah Alih

Untuk mengelakkan isu ini, kita boleh menggunakan jenis integer yang lebih besar, seperti int64, yang mempunyai julat yang lebih tinggi dan boleh menampung nilai pemalar yang lebih besar.

<code class="go">const (
    userid int64 = 12345
    did = (userid &^ (0xFFFF << 48))
)</code>

Perubahan ini membolehkan kami untuk mewakili dan memanipulasi pemalar dalam kekangan jenis integer yang tersedia tanpa menghadapi limpahan.

Atas ialah kandungan terperinci Mengapa Kod Go Saya Mengalami Ralat Limpahan Apabila Menggunakan 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