Gelagat Tidak Ditakrifkan dalam Operasi Shift Kiri dengan Operand Kiri Negatif dalam C
Dalam C, operasi anjakan kiri bitwise (<< ;) memanggil tingkah laku yang tidak ditentukan apabila operan sebelah kiri mempunyai nilai negatif. Ini dinyatakan dalam ISO C99 (6.5.7/4), yang menunjukkan bahawa hasil peralihan kiri nilai negatif (jenis bertanda) tidak ditentukan.</p><p><strong>Rasional untuk Tingkah Laku Tidak Tertakrif dalam C</strong> </p><p>Standard tidak memberikan sebab yang jelas untuk tingkah laku yang tidak ditentukan ini. Walau bagaimanapun, boleh disimpulkan bahawa ini adalah disebabkan oleh kesukaran dalam mentakrifkan hasil yang konsisten dan boleh diramal untuk nilai negatif peralihan kiri, terutamanya dengan mengambil kira tingkah laku nilai negatif yang bergantung kepada pelaksanaan dalam perwakilan pelengkap dua.</p><p><strong> Gelagat yang Ditakrifkan dengan Baik dalam C </strong></p><p>Berbeza dengan C, operasi anjakan kiri dalam C (ISO C -03 5.8/2) tidak menggunakan tingkah laku yang tidak ditentukan untuk jenis yang ditandatangani jika keputusan boleh diwakili dalam jenis hasil. Perubahan ini dibuat oleh jawatankuasa ISO C untuk memastikan ketekalan dalam kelakuan operasi anjakan kiri tanpa mengira tanda operan.</p><p><strong>Tingkah Laku Ditentukan Pelaksanaan dalam Operasi Anjakan Kanan dengan Operand Kiri Negatif</strong></p><p>Tidak seperti operasi syif kiri, operasi syif kanan (<code >>>) memanggil tingkah laku yang ditentukan pelaksanaan apabila operan kiri adalah negatif. Menurut Piawaian, ini adalah kerana pemotongan bit dari sebelah kiri bergantung pada pelaksanaan untuk nilai negatif dalam perwakilan pelengkap dua.
Kesimpulan
Sebab undefined tingkah laku dalam operasi anjakan kiri dengan operan negatif dalam C dan tingkah laku yang jelas dalam C adalah terutamanya disebabkan oleh kerumitan mentakrifkan hasil yang konsisten untuk negatif nilai. Gelagat pelaksanaan yang ditentukan bagi operasi anjakan kanan pada operan negatif mencerminkan fakta bahawa pemotongan bit dari kiri dalam perwakilan pelengkap dua adalah khusus pelaksanaan.
Atas ialah kandungan terperinci Mengapakah Left Shifting a Negative Number Undefined Gelagat dalam C tetapi Well-Defined dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!