Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apa yang Berlaku Apabila Anda Menganjak Kanan Integer Tidak Bertanda dengan Kiraan Anjakan Melebihi Lebarnya?

Apa yang Berlaku Apabila Anda Menganjak Kanan Integer Tidak Bertanda dengan Kiraan Anjakan Melebihi Lebarnya?

Linda Hamilton
Linda Hamiltonasal
2024-11-02 12:18:30663semak imbas

What Happens When You Right Shift an Unsigned Integer with a Shift Count Exceeding Its Width?

Gelagat Anjakan Kanan dengan Kiraan Melebihi

Persoalan timbul berkenaan kelakuan operasi anjakan kanan dalam C apabila kiraan anjakan melebihi lebar daripada jenis data. Menurut piawaian C, peralihan ke kanan nilai yang tidak ditandatangani dengan kiraan bukan negatif harus menghasilkan hasil bahagi kamiran bagi nilai asal dibahagikan dengan 2^E2. Walau bagaimanapun, pengguna memerhatikan gelagat yang tidak dijangka dengan GCC pada platform Intel.

Isu ini berpunca daripada fakta bahawa piawaian C menyatakan tingkah laku itu tidak ditentukan jika operan yang betul (kiraan anjakan) lebih besar daripada atau sama dengan lebar operan kiri yang dipromosikan (nilai data sedang dianjak). Dalam kes ini, memandangkan int yang tidak ditandatangani biasanya 32 bit atau kurang, kiraan anjakan 34 dianggap sebagai gelagat tidak ditentukan.

Amaran GCC "kiraan anjakan kanan >= lebar jenis" menunjukkan gelagat yang tidak ditentukan ini. Nilai terhasil 67108863 yang diperhatikan dalam kod pemasangan juga menyokong ini. Oleh itu, isunya bukan terletak pada pelaksanaan piawaian GCC tetapi pada tingkah laku yang tidak ditentukan yang disebabkan oleh melebihi lebar jenis data dalam operasi anjakan.

Atas ialah kandungan terperinci Apa yang Berlaku Apabila Anda Menganjak Kanan Integer Tidak Bertanda dengan Kiraan Anjakan Melebihi Lebarnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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