Rumah >pembangunan bahagian belakang >C++ >Mengapakah Left Shifting Nombor Negatif Tingkah Laku Tidak Ditakrifkan dalam C tetapi Ditakrifkan dalam C ?

Mengapakah Left Shifting Nombor Negatif Tingkah Laku Tidak Ditakrifkan dalam C tetapi Ditakrifkan dalam C ?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-11 10:14:11476semak imbas

Why is Left Shifting a Negative Number Undefined Behavior in C but Defined in C  ?

Kendalian Anjakan Kiri dan Kelakuan Tidak Ditakrifkan dalam Konteks Operand Negatif

Dalam C, operasi anjakan kiri menggunakan gelagat yang tidak ditentukan apabila operan sebelah kiri negatif . Menurut ISO C99, tingkah laku ditakrifkan dengan baik hanya untuk operan yang ditandatangani bukan negatif. Ini dikaitkan dengan potensi kekaburan dalam mewakili bit yang dikosongkan.

Perbezaan C

Berbeza dengan C, C mentakrifkan gelagat untuk operasi anjakan kiri dengan operan negatif. C -03 menentukan bahawa hasilnya ialah corak bit operan kiri yang dialihkan ke kiri dengan bilangan kedudukan yang ditentukan, dengan bit kosong diisi sifar. Tambahan pula, jika operan kiri tidak ditandatangani, hasilnya ialah operan didarab dengan 2 dinaikkan kepada kuasa kiraan anjakan, modulo dikurangkan pemalar tertentu bergantung pada jenis.

Sebab Kelakuan Tidak Ditakrifkan dalam C

Tingkah laku yang tidak ditentukan dalam C timbul daripada isu cara mengendalikan yang dikosongkan bit. Dalam kes operasi anjakan kiri, bit yang dikosongkan boleh diisi dengan sama ada satu atau sifar, tetapi tingkah laku harus konsisten. Contohnya, dalam ungkapan -1 << 2, jika bit yang dikosongkan diisi dengan satu, hasilnya ialah -4, tetapi jika ia diisi dengan sifar, hasilnya ialah 4026531840.

Kerumitan Operasi Shift Kanan

Sebaliknya, operasi anjakan kanan dengan operan negatif hanya ditentukan pelaksanaan, bukan tidak ditentukan. Ini kerana bit yang dikosongkan diisi dengan bit yang sedang dialih keluar. Dengan perwakilan pelengkap dua, bit tanda dialihkan keluar, dan ia hanya menentukan sama ada hasilnya positif atau negatif. Pelaksanaan mempunyai fleksibiliti untuk memutuskan sama ada untuk mengisi bit kosong dengan sifar atau dengan bit tanda, menjadikan pelaksanaan tingkah laku ditentukan.

Atas ialah kandungan terperinci Mengapakah Left Shifting Nombor Negatif Tingkah Laku Tidak Ditakrifkan dalam C tetapi Ditakrifkan dalam C ?. 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