Mengapa Kod Go Saya Mengalami Ralat Limpahan Apabila Menggunakan Pemalar?

Barbara Streisand
Lepaskan: 2024-11-02 00:42:02
asal
643 orang telah melayarinya

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>
Salin selepas log masuk

Menyusun kod ini menyebabkan ralat berikut:

constant -18446462598732840961 overflows int
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!