Nilai Negatif dalam Pembolehubah Tidak Bertanda: Kes Ingin Tahu
Apabila memberikan nilai negatif kepada pembolehubah yang tidak ditandatangani, tingkah laku yang tidak dijangka mungkin berlaku. Pertimbangkan kod berikut:
unsigned int nVal = 0; nVal = -5;
Dalam senario ini, pembolehubah nVal tidak menerima ralat pengkompil, sebaliknya diberikan nilai luar biasa semasa pelaksanaan program. Mungkinkah sebabnya ialah penukaran kepada nilai pelengkap 2?
The Unraveling
Jawapannya terletak dalam Bahagian 4.7 standard C, yang mengawal penukaran daripada jenis kamiran yang ditandatangani :
"_Jika jenis destinasi tidak ditandatangani, nilai yang terhasil adalah yang paling tidak ditandatangani integer kongruen dengan integer sumber (modulo 2n dengan n ialah bilangan bit yang digunakan untuk mewakili jenis tidak bertanda)._"
Implikasi untuk Pelengkap 2
Pernyataan ini menyerlahkan bahawa dalam perwakilan pelengkap 2 (iaitu lalai untuk ditandatangani integer dalam seni bina moden), penukaran kepada unsigned berkesan melaksanakan operasi modulo. Oleh itu, nilai negatif ditukar kepada nilai positif dengan membungkus ruang bit.
Manipulasi Bit dan Peranan Modulo
Dalam sistem pelengkap 2, bit corak kekal tidak berubah semasa penukaran tidak ditandatangani, kerana operasi modulo melibatkan penambahan atau penolakan 2n. Disebabkan sifat pelengkap 2, penambahan atau penolakan ini tidak mengubah suai bit tertib rendah, memastikan corak bit dikekalkan.
Kesimpulan
Pemahaman mekanisme penukaran ini adalah penting untuk mengendalikan pembolehubah tidak ditandatangani, terutamanya apabila berurusan dengan input negatif. Walaupun tingkah laku tertentu mungkin berbeza-beza bergantung pada seni bina, operasi modulo ialah prinsip asas yang mengawal penukaran ini dalam sistem pelengkap 2.
Atas ialah kandungan terperinci Mengapa Tugasan Negatif kepada Pembolehubah Tidak Ditandatangani Menghasilkan Keputusan yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!