Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Peralihan Kanan Integer Tidak Ditandatangani dengan Kiraan Melebihi Gelagat Tidak Ditakrifkan Lebar Jenisnya dalam C?

Adakah Peralihan Kanan Integer Tidak Ditandatangani dengan Kiraan Melebihi Gelagat Tidak Ditakrifkan Lebar Jenisnya dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-11-02 12:16:30511semak imbas

Is Right Shifting an Unsigned Integer with a Count Exceeding its Type Width Undefined Behavior in C  ?

Gelagat Anjakan Kanan Tidak Ditakrifkan dengan Kiraan Melebihi Lebar Jenis

Dalam C , gelagat operator anjakan kanan (>>) ditakrifkan dalam piawaian, khususnya dalam bahagian 5.8, Operator Shift. Timbul persoalan sama ada kiraan anjakan yang lebih besar daripada atau sama dengan lebar jenis operan kiri ialah kelakuan tidak ditentukan.

Piawaian C menyatakan bahawa nilai E1 >> E2 ialah bahagian integral bagi hasil bagi E1/2^E2, di mana E1 ialah operan kiri dan E2 ialah operan kanan. Ini menunjukkan bahawa tingkah laku hanya ditakrifkan jika E1 mempunyai jenis yang tidak ditandatangani atau jenis yang ditandatangani dengan nilai bukan-negatif dan E2 adalah bukan-negatif.

Walau bagaimanapun, soalan itu menganggap kes di mana E1 adalah jenis tidak ditandatangani int dan E2 ialah 34, yang melebihi lebar 32 bit untuk int yang tidak ditandatangani. Piawaian secara eksplisit menyatakan bahawa tingkah laku dalam kes ini tidak ditentukan.

Oleh itu, walaupun kenyataan dalam piawaian C berkenaan pengiraan hasil bahagi, kelakuan peralihan ke kanan int tidak bertanda dengan kiraan lebih daripada 32 tidak ditentukan. Inilah sebabnya GCC mengeluarkan amaran apabila melakukan syif sedemikian.

Atas ialah kandungan terperinci Adakah Peralihan Kanan Integer Tidak Ditandatangani dengan Kiraan Melebihi Gelagat Tidak Ditakrifkan Lebar Jenisnya dalam C?. 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