Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah membandingkan integer bertanda dan tidak bertanda dalam C mencetuskan amaran?

Mengapakah membandingkan integer bertanda dan tidak bertanda dalam C mencetuskan amaran?

DDD
DDDasal
2024-11-07 02:53:03505semak imbas

Why does comparing signed and unsigned integers in C   trigger a warning?

Membanding Nombor Bulat Bertanda dan Tidak Bertanda: Kisah Berhati-hati

Semasa mengerjakan latihan 2-3 dari "C Accelerated ," pelajar mungkin menghadapi amaran yang berkaitan dengan membandingkan yang ditandatangani dan ungkapan integer tidak bertanda. Amaran ini timbul apabila menggunakan integer (int) untuk membandingkan dengan rentetan::size_type.

Memahami Integer Bertanda vs. Tidak Bertanda

Integer dalam C boleh sama ada ditandatangani atau tidak ditandatangani. Integer yang ditandatangani mempunyai julat nilai dari -2^(n-1) hingga 2^(n-1) - 1, dengan n ialah bilangan bit yang mewakili integer. Integer tidak bertanda, sebaliknya, mempunyai julat 0 hingga 2^n - 1.

Amaran dan Puncanya

Amaran dalam kod yang diberikan berlaku kerana pembolehubah r ialah int, yang ditandatangani, manakala padtopbottom juga merupakan int. Walau bagaimanapun, c ialah rentetan::size_type, yang tidak ditandatangani pada kebanyakan platform. Apabila membandingkan integer yang ditandatangani dan tidak ditandatangani, pengkompil memberi amaran untuk menunjukkan potensi tingkah laku yang tidak dijangka disebabkan oleh julat nilai yang berbeza.

Amalan dan Syor Terbaik

Untuk mengelakkan amaran dan potensi isu sedemikian, ia adalah disyorkan untuk:

  • Tentukan secara eksplisit sama ada integer ditandatangani atau tidak ditandatangani (cth., gunakan unsigned int untuk padsides).
  • Gunakan jenis tepat yang akan anda bandingkan (mis., gunakan size_t untuk perbandingan dengan panjang rentetan).
  • Jika perbandingan antara jenis yang ditandatangani dan yang tidak ditandatangani diperlukan, pertimbangkan untuk menukar secara eksplisit satu nilai kepada jenis yang serasi dengan yang lain, menyemak kesahihan sebelum penukaran.

Penjelasan Lanjut daripada "C Accelerated "

Kod yang disediakan tidak termasuk kod daripada program contoh dalam "Accelerated C ." Ada kemungkinan bahawa program asal menggunakan const int untuk padding kerana diketahui bahawa nilainya adalah positif dan const digunakan untuk kejelasan. Walau bagaimanapun, apabila menggunakan input pengguna, adalah penting untuk mengisytiharkan pembolehubah sebagai tidak ditandatangani atau size_t untuk mengelakkan amaran yang dinyatakan di atas. Bab-bab seterusnya dalam buku ini mungkin memberikan pandangan lanjut tentang pengendalian perbandingan sedemikian dengan sewajarnya.

Atas ialah kandungan terperinci Mengapakah membandingkan integer bertanda dan tidak bertanda dalam C mencetuskan amaran?. 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