Rumah > Artikel > pembangunan bahagian belakang > Mengapa Limpahan Malar Saya Apabila Menggunakan Operasi Bitwise?
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?
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.
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!