Anjakan Ke Kanan dengan Kiraan Melebihi Jenis Lebar: Kelakuan Tidak Ditakrifkan
Dalam C , operator anjakan kanan (>>) melakukan logik atau operasi anjakan aritmetik pada integer. Walaupun gelagat pengendali ini secara amnya ditakrifkan dengan baik, terdapat syarat tertentu yang boleh membawa kepada gelagat yang tidak ditentukan.
Satu syarat sedemikian ialah apabila kiraan anjakan melebihi lebar jenis yang dialihkan. Piawaian C secara eksplisit menyatakan bahawa "Tingkah laku tidak ditentukan jika operan kanan adalah negatif, atau lebih besar daripada atau sama dengan panjang dalam bit operan kiri yang digalakkan."
Ini menunjukkan bahawa menganjakkan integer dengan kiraan lebih besar daripada atau sama dengan lebar bitnya tidak ditentukan, tidak kira sama ada operan itu ditandatangani atau tidak ditandatangani. Secara teori, ini bermakna bahawa hasil peralihan sedemikian tidak dijamin dan mungkin berbeza-beza merentas pelaksanaan yang berbeza.
Walau bagaimanapun, dalam amalan, sesetengah penyusun mungkin melaksanakan gelagat tertentu dalam kes sedemikian. Sebagai contoh, GCC mengeluarkan amaran apabila kiraan anjakan melebihi lebar jenis, tetapi tidak menimbulkan ralat. Tingkah laku ini tidak ditakrifkan secara eksplisit dalam standard C dan mungkin berbeza-beza merentas platform yang berbeza.
Dalam coretan kod yang disediakan, anjakan ke kanan bagi integer tidak ditandatangani sebanyak 34 dilakukan:
<code class="cpp">unsigned int val = 0x0FFFFFFF; unsigned int res = val >> 34;</code>
Hasil yang dikira mengikut piawaian C hendaklah 0, kerana kiraan anjakan lebih besar daripada lebar jenis int yang tidak ditandatangani (yang biasanya 32 bit). Walau bagaimanapun, GCC memberi amaran dan sebaliknya mengira hasilnya sebagai 67108863.
Percanggahan ini timbul kerana GCC melaksanakan gelagat khusus untuk kes yang tidak ditentukan ini. Kod pemasangan yang dijana menggunakan arahan SHRL, yang melakukan peralihan kanan yang logik dan tidak menandatangani-lanjutkan hasilnya. Akibatnya, hasilnya bukan sifar sebaliknya nilai bukan sifar.
Oleh itu, apabila bekerja dengan operasi syif dalam C , adalah penting untuk memastikan kiraan syif tidak melebihi lebar jenis sedang dialihkan. Melebihi lebar jenis boleh membawa kepada tingkah laku yang tidak ditentukan dan hasil yang tidak boleh dipercayai merentas penyusun dan platform yang berbeza.
Atas ialah kandungan terperinci Apa yang Berlaku Apabila Anda Beralih Ke Kanan dengan Kiraan Melebihi Lebar Jenis dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!