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
Lepaskan: 2024-12-11 10:14:11
asal
477 orang telah melayarinya

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!

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