Rumah > Artikel > pembangunan bahagian belakang > Apa yang Berlaku Apabila Kiraan Shift Kanan Melebihi Lebar Jenis dalam C ?
Tingkah Laku Anjakan Kanan yang Tidak Ditakrifkan dengan Kiraan Bersaiz Besar
Dalam C , pengendali anjakan kanan (>>) melakukan anjakan bitwise pada operan kiri, menggerakkan bit ke kanan dengan bilangan kedudukan yang ditentukan oleh operan kanan. Walau bagaimanapun, terdapat kes tertentu di mana operasi ini boleh mengakibatkan tingkah laku yang tidak ditentukan.
Mengikut piawaian C, kelakuan anjakan kanan tidak ditentukan jika operan kiri mempunyai jenis bertanda dan nilai negatif. Walau bagaimanapun, persoalan timbul tentang kelakuan apabila operan kanan lebih besar daripada atau sama dengan lebar operan kiri.
Piawaian C menyatakan bahawa nilai integer teranjak kanan ialah bahagian integral bagi hasil bagi operan kiri dibahagikan dengan 2 kepada kuasa operan kanan. Ini menunjukkan bahawa untuk jenis yang tidak ditandatangani atau jenis yang ditandatangani bukan negatif, hasilnya hendaklah sifar apabila operan kanan lebih besar daripada lebar bit operan kiri.
Walau bagaimanapun, kod contoh yang diberikan mendedahkan percanggahan dengan gelagat yang dijangkakan , kerana GCC menghasilkan keputusan bukan sifar (67108863) dan mengeluarkan amaran tentang kiraan anjakan yang betul lebih besar daripada lebar jenis.
Ini menunjukkan bahawa tingkah laku dalam kes ini tidak ditakrifkan dengan ketat oleh standard C . Bahagian 5.8 piawaian C menyatakan bahawa "tingkah laku tidak ditentukan jika operan kanan... lebih besar daripada atau sama dengan panjang dalam bit operan kiri yang digalakkan." Oleh kerana lebar jenis unsigned int biasanya 32 bit atau kurang, operan kanan 34 seperti dalam contoh adalah tingkah laku yang tidak ditentukan.
Oleh itu, walaupun piawaian mencadangkan hasil sifar dalam kes sedemikian, tingkah laku sebenar ialah ditakrifkan pelaksanaan dan GCC memilih untuk menghasilkan hasil bukan sifar dengan amaran. Ini menekankan kepentingan memastikan operasi anjakan yang betul dengan jumlah yang besar dikendalikan dengan sewajarnya untuk mengelakkan tingkah laku yang tidak ditentukan dalam C .
Atas ialah kandungan terperinci Apa yang Berlaku Apabila Kiraan Shift Kanan Melebihi Lebar Jenis dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!