Rumah >pembangunan bahagian belakang >Golang >Mengapa Kod Go Saya Melemparkan Ralat Limpahan Malar Apabila Menggunakan Operasi Bitwise dengan Pemalar Tidak Ditaip?
Memahami Limpahan Malar dalam Go
Bahasa pengaturcaraan Go menawarkan sistem jenis komprehensif, termasuk konsep pemalar. Walau bagaimanapun, apabila bekerja dengan pemalar, adalah penting untuk mengetahui potensi limpahan. Satu kes sedemikian melibatkan penggunaan pemalar yang tidak ditaip untuk melaksanakan operasi bitwise pada pembolehubah yang ditaip.
Penerangan Isu
Pertimbangkan coretan kod berikut:
<code class="go">userid := 12345 did := (userid & ^(0xFFFF << 48))</code>
Semasa cuba menyusun kod ini, anda mungkin menghadapi mesej ralat:
./xxxx.go:511: constant -18446462598732840961 overflows int
Penjelasan
Ungkapan ^(0xFFFF << 48) mewakili pemalar yang tidak ditaip. Dalam Go, pemalar yang tidak ditaip boleh menganggap nilai yang besar secara sewenang-wenangnya. Dalam kes ini, hasil operasi penolakan ialah -0xffff000000000001, yang terlalu besar untuk dimuatkan ke dalam int.
Apabila anda menetapkan hasil operasi bitwise kepada pembolehubah did, iaitu jenis int, pengkompil cuba menukar pemalar yang tidak ditaip kepada int, mengakibatkan ralat limpahan.
Penyelesaian
Untuk menyelesaikan isu ini, anda boleh menggunakan pemalar alternatif yang sesuai dalam jenis int. Sebagai contoh, anda boleh menggantikan ungkapan bermasalah dengan 1<<48 - 1. Pengiraan ini menghasilkan pemalar 0x0000ffffffffffff, yang serasi dengan int64 pada sistem 64-bit.
Petua Tambahan
Jika anda menyasarkan kemudahalihan, anda disyorkan untuk menggunakan int64 dan bukannya int dalam kod anda. Ini memastikan bahawa kod yang disebutkan akan berfungsi dengan betul walaupun pada sistem yang int adalah 32-bit.
Atas ialah kandungan terperinci Mengapa Kod Go Saya Melemparkan Ralat Limpahan Malar Apabila Menggunakan Operasi Bitwise dengan Pemalar Tidak Ditaip?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!