Mengapakah GCC Menghasilkan Gelagat Tidak Ditakrifkan dalam Operasi Anjakan Kanan dengan Kiraan Anjakan Berlebihan?

DDD
Lepaskan: 2024-11-02 09:21:02
asal
150 orang telah melayarinya

Why Does GCC Produce Undefined Behavior in Right Shift Operations with Excessive Shift Counts?

Gelagat Tidak Ditakrifkan dalam Operasi Anjakan Kanan dengan Kiraan Anjakan Berlebihan

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>
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan