Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Limpahan Malar Saya Apabila Menggunakan Operasi Bitwise?

Mengapa Limpahan Malar Saya Apabila Menggunakan Operasi Bitwise?

Patricia Arquette
Patricia Arquetteasal
2024-11-01 08:55:30107semak imbas

Why Does My Go Constant Overflow When Using Bitwise Operations?

Masalah dengan Limpahan Malar Go: Menyelesaikan Limpahan Int

Dalam bidang pengaturcaraan Go, soalan biasa timbul: "Mengapa limpahan berterusan saya apabila userid := 12345 dan adakah := (userid &^(0xFFFF << 48))?"

Apabila menyusun kod sedemikian, ralat yang digeruni muncul: "constant -18446462598732840961 overflows int." Tetapi apakah yang ada di bawah mesej yang mengelirukan ini?

Intipati Isu

Penyebab di sebalik celaka ini ialah sifat pemalar yang tidak ditaip ^(0xFFFF << 48). Go memberikan nilai kolosal pemalar yang tidak ditaip, melebihi had integer konvensional.

0xffff << 48 menghasilkan 0xffff000000000000. Membalikkan tandanya menggunakan operator penolakan bitwise (^) menghasilkan -0xffff0000000000001.

Kini, id pengguna pembolehubah, yang dimulakan dengan nilai 12345, mewarisi jenis int. Apabila operasi AND bitwise (&) dilakukan, pengkompil menganggap bahawa pemalar yang tidak ditaip harus diturunkan taraf kepada jenis int. Andaian ini membawa kepada pertembungan, kerana magnitud pemalar melebihi nilai maksimum yang boleh diterima untuk int.

Penyelesaian: Menjinakkan Gergasi Tidak Ditaip

Untuk menyelesaikan isu ini, terima kuasa pemutus jenis . Jika anda berniat untuk menetapkan pemalar 0x0000ffffffffffff, pertimbangkan untuk menggunakan 1<<48 - 1. Ungkapan ini, apabila digunakan dalam persekitaran 64-bit, memastikan keserasian dengan integer yang lebih besar.

Untuk kemudahalihan sebenar, elakkan int memihak kepada int64, meluaskan skop kod anda untuk menampung kedua-dua seni bina 32-bit dan 64-bit.

Atas ialah kandungan terperinci Mengapa Limpahan Malar Saya Apabila Menggunakan Operasi Bitwise?. 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