Rumah >pembangunan bahagian belakang >C++ >Apa yang Berlaku Apabila Anda Memberikan Nilai Negatif kepada Pembolehubah Integer Tidak Bertanda dalam C ?
Menetapkan Nilai Negatif kepada Pembolehubah Tidak Bertanda: Membongkar Misteri
Tertarik dengan kemungkinan hasil daripada memberikan nilai negatif kepada pembolehubah tidak bertanda, seorang pengaturcara memulakan pada eksperimen. Menetapkan nilai negatif -5 kepada pembolehubah integer tidak bertanda bernama nVal, mereka terkejut dengan kekurangan ralat pengkompil. Walau bagaimanapun, menjalankan program menunjukkan hasil yang tidak dijangka - nVal mempunyai nilai yang tersendiri.
Mencari penjelasan, pengaturcara menyelidiki standard C. Bahagian 4.7 conv.integral mengenai penukaran daripada jenis integer yang ditandatangani memberikan cerapan. Mengikut piawaian, jika jenis destinasi tidak ditandatangani, "nilai yang terhasil ialah integer yang paling tidak ditandatangani yang kongruen dengan integer sumber (modulo 2n di mana n ialah bilangan bit yang digunakan untuk mewakili jenis yang tidak ditandatangani) ."
Pada dasarnya, ini bermakna untuk seni bina bukan Two's Complement (cth., Ditandatangani Magnitud, One's Complement), penukaran kepada unsigned berkelakuan seolah-olah Two's Complement digunakan. Tambahan pula, menambah atau menolak 2n berulang kali sehingga nilai berada dalam julat jenis yang tidak ditandatangani secara matematik bersamaan dengan sambungan tanda pelengkap 2 atau pemotongan.
Khususnya, untuk pelengkap 2, corak bit kekal tidak berubah kerana menambah 2n membatalkan sebarang perubahan: n bit rendah 2n semuanya adalah sifar. Sifat ini menjadikan penambahan/penolakan pelengkap 2 bersamaan dengan operasi tidak bertanda bitwise, oleh itu status istimewanya.
Perlu diperhatikan bahawa penukaran daripada titik terapung kepada integer tidak bertanda berbeza. Dalam kes sedemikian, nilai negatif atau nilai yang melebihi julat jenis yang tidak ditandatangani mengakibatkan tingkah laku yang tidak ditentukan. Hanya integer yang ditandatangani kepada penukaran integer yang tidak ditandatangani menggunakan pengurangan modulo.
Atas ialah kandungan terperinci Apa yang Berlaku Apabila Anda Memberikan Nilai Negatif kepada Pembolehubah Integer Tidak Bertanda dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!