Rumah > Artikel > pembangunan bahagian belakang > Mengapa Kod Go Saya Mengalami Ralat Limpahan Apabila Menggunakan Pemalar?
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!