Rumah > pembangunan bahagian belakang > C++ > Mengapa Adakah (1 >> 32) Mengembalikan 1 dalam C : Menyelam Lebih Dalam ke dalam Gelagat Operator Shift Kanan dan Gelagat Tidak Ditakrifkan?

Mengapa Adakah (1 >> 32) Mengembalikan 1 dalam C : Menyelam Lebih Dalam ke dalam Gelagat Operator Shift Kanan dan Gelagat Tidak Ditakrifkan?

Barbara Streisand
Lepaskan: 2024-10-27 13:48:01
asal
764 orang telah melayarinya

Why Does (1 >> 32) Kembalikan 1 dalam C : Menyelam Lebih Dalam ke dalam Gelagat Operator Shift Kanan dan Gelagat Tidak Ditakrifkan? 
> 32) Kembali 1 dalam C : Menyelam Lebih Dalam ke dalam Gelagat Operator Shift Kanan dan Gelagat Tidak Ditakrifkan? " />

Rasa ingin tahu yang mengelilingi Operator Shift Kanan (1 >> 32)

Apabila menggunakan operator shift kanan (>>) dalam Kod C, selalunya diandaikan bahawa peralihan dengan nilai yang lebih besar daripada atau sama dengan lebar operan akan menghasilkan sifar Walau bagaimanapun, seperti yang ditunjukkan dalam coretan kod yang disediakan, andaian ini boleh membawa kepada tingkah laku yang tidak dijangka.

Fungsi foo(a, b) mengalihkan integer a dengan b bit Apabila dipanggil dengan argumen (1, 32), ia secara mengejutkan mengembalikan 1 dan bukannya 0 yang dijangkakan. Tingkah laku ini berpunca daripada pengkompil yang merawat ungkapan malar 1 >> 32 pada masa penyusunan, di mana ia menilai kepada 0 disebabkan oleh kelakuan tidak ditentukan yang diterangkan dalam piawai C.

Sebaliknya, fungsi bar(a, b) beroperasi pada integer tidak bertanda 64-bit dan mengembalikan dengan betul 0 apabila beralih sebanyak 32 bit Ini kerana 64 lebih besar daripada 32, menjamin bahawa anjakan akan menghasilkan 0. Walau bagaimanapun, walaupun untuk bar, peralihan sebanyak 64 bit masih boleh mengembalikan 1.

Menjelaskan tingkah laku ini dengan lebih lanjut, pelaksanaan perkakasan operasi anjakan menutup kiraan anjakan kepada 5 atau 6 bit (bergantung pada seni bina), dengan berkesan memotong sebarang kiraan anjakan yang lebih besar daripada atau sama dengan 32 atau 63. Oleh itu, anjakan kanan logik (LSR) pada seni bina tertentu memastikan bahawa anjakan ≥32 akan sentiasa menghasilkan sifar.

Ini menyerlahkan sifat tidak mudah alih untuk mengalihkan integer 32-bit sebanyak ≥32, kerana hasilnya boleh berbeza-beza bergantung pada pelaksanaan perkakasan asas.

Atas ialah kandungan terperinci Mengapa Adakah (1 >> 32) Mengembalikan 1 dalam C : Menyelam Lebih Dalam ke dalam Gelagat Operator Shift Kanan dan Gelagat Tidak Ditakrifkan?. 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