Rumah >pembangunan bahagian belakang >C++ >Adakah Limpahan Integer Ditandatangani Masih Kelakuan Tidak Ditakrifkan dalam C ?

Adakah Limpahan Integer Ditandatangani Masih Kelakuan Tidak Ditakrifkan dalam C ?

DDD
DDDasal
2024-12-21 04:02:09823semak imbas

Is Signed Integer Overflow Still Undefined Behavior in C  ?

Adakah Limpahan Integer Ditandatangani Masih Tidak Ditakrifkan Gelagat dalam C ?

Seperti yang ditakrifkan dalam piawaian C 11, limpahan integer yang ditandatangani kekal sebagai gelagat tidak ditentukan. Walaupun dokumentasi cstdint menyatakan bahawa jenis int8_t, int16_t, int32_t dan int64_t menggunakan pelengkap 2 untuk nilai negatif, tingkah laku limpahan masih dianggap tidak ditentukan.

Piawaian C 11 dalam Perenggan 5/4 dengan tegas menyatakan:**Jika semasa penilaian sesuatu ungkapan, hasilnya tidak ditakrifkan secara matematik atau tidak dalam julat

nilai yang boleh diwakili untuk jenisnya, tingkah laku itu tidak ditentukan.**
Oleh itu, walaupun perwakilan pelengkap dua digunakan untuk jenis bertanda ini, modulo aritmetik 2 ^n tidak diandaikan secara tersirat semasa penilaian.

Sebaliknya, Piawaian C 11 dengan jelas menyatakan dalam Perenggan 3.9.1/4 bahawa aritmetik tidak bertanda mematuhi aritmetik modular:

Integer tidak bertanda, diisytiharkan tidak bertanda, hendaklah mematuhi undang-undang modulo aritmetik 2^n dengan n ialah nombor bit dalam perwakilan nilai saiz tertentu itu integer
Oleh itu, operasi aritmetik yang tidak ditandatangani sentiasa boleh ditakrifkan secara matematik, dan nilai yang terhasil berada dalam julat yang boleh diwakili, sekali gus mengecualikannya daripada klausa kelakuan tidak ditentukan. Nota kaki 46 menjelaskan lagi perkara ini:

Ini membayangkan bahawa
tidak bertanda aritmetik tidak melimpah kerana hasil yang tidak boleh diwakili oleh hasiljenis integer tidak bertanda dikurangkan modulo nombor yang satu lebih besar daripada nilai terbesar yang boleh diwakili oleh
integer tak bertanda yang terhasil jenis.
Ringkasnya, sementara penggunaan perwakilan pelengkap 2 untuk jenis yang ditandatangani menyediakan gelagat yang jelas untuk nilai negatif, limpahan integer untuk jenis ini kekal sebagai gelagat yang tidak ditentukan dalam C , kerana Standard mengatasi sebarang gelagat yang bergantung kepada pelaksanaan .

Atas ialah kandungan terperinci Adakah Limpahan Integer Ditandatangani Masih Kelakuan Tidak Ditakrifkan 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