Dalam piawai C, gelagat operasi anjakan kanan ditakrifkan dengan baik untuk kiraan anjakan bukan negatif. Walau bagaimanapun, apabila kiraan anjakan melebihi lebar jenis yang dialihkan, tingkah laku itu dianggap tidak ditentukan.
Pertimbangkan kod berikut:
<code class="cpp">unsigned int val = 0x0FFFFFFF; unsigned int res = val >> 34; // res should be 0 by C++ standard</code>
Mengikut piawaian C, kerana 34 ialah bukan nombor negatif, nilai nilai yang terhasil hendaklah 0. Walau bagaimanapun, GCC menimbulkan amaran untuk coretan kod ini dan menghasilkan hasil bukan sifar.
Tindakan GCC dalam kes ini boleh dijelaskan oleh petikan berikut daripada draf C standard seksyen 5.8 Operator Shift:
Jenis keputusan ialah operan kiri yang dinaikkan pangkat. Tingkah laku tidak ditentukan jika operan kanan adalah negatif, atau lebih besar daripada atau sama dengan panjang dalam bit operan kiri yang digalakkan.
Dalam kes ini, jika unsigned int ialah 32 bit atau kurang, maka kiraan anjakan 34 melebihi lebar operan kiri yang dipromosikan. Oleh itu, tingkah laku tidak ditentukan dan amaran GCC adalah wajar.
Adalah penting untuk ambil perhatian bahawa tingkah laku yang tidak ditentukan dalam konteks ini tidak merujuk kepada nilai yang tidak ditentukan. Sebaliknya, ini bermakna bahawa gelagat itu ditentukan pelaksanaan dan mungkin berbeza-beza merentas penyusun dan platform yang berbeza. Dalam kes ini, gelagat GCC pada platform Intel tidak selaras dengan jangkaan standard C.
Atas ialah kandungan terperinci Mengapakah GCC Menghasilkan Gelagat Tidak Ditakrifkan dalam Operasi Anjakan Kanan dengan Kiraan Anjakan Berlebihan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!