Rumah > Artikel > pembangunan bahagian belakang > Mengapakah fmt.Printf menunjukkan perwakilan binari yang berbeza untuk integer negatif daripada yang dijangkakan dalam Go?
Two's Complement and fmt.Printf: Membongkar Enigma Perwakilan Perduaan
Apabila bekerja dengan integer bertanda, komputer menggunakan Two's complement untuk mewakili nilai negatif . Ini berbeza daripada perwakilan binari biasa, di mana tanda ditunjukkan oleh bit yang berasingan. Sebagai contoh, dalam pelengkap Two, integer -5 diwakili sebagai 1111 1011.
Walau bagaimanapun, mencetak perwakilan binari menggunakan fmt.Printf mungkin menghasilkan hasil yang tidak dijangka. Sebagai contoh, coretan kod berikut:
var i int8 = -5 fmt.Printf("%b", i)
mengejutkan mengeluarkan -101 dan bukannya 1111 1011. Percanggahan ini telah membawa kepada persoalan sama ada pelengkap Two benar-benar digunakan untuk perwakilan dalaman atau jika pemformatan mengaburkan perwakilan yang betul.
Untuk menjelaskan perkara ini, kita perlu menyelidiki bagaimana fmt.Printf memformat nombor perduaan. Pelakunya berada dalam fungsi fmt.integer, yang secara automatik menukar integer bertanda negatif kepada positif. Penukaran ini melibatkan menafikan integer dan menambahkan tanda - pada rentetan output. Oleh itu, output -101 ialah perwakilan daripada - dilampirkan pada perwakilan binari 5.
Untuk menunjukkan ini dengan lebih lanjut, tukarkan integer yang ditandatangani kepada integer yang tidak ditandatangani dan kemudian memformatkannya menggunakan fmt.Printf menghasilkan Two's yang betul perwakilan pelengkap:
var u uint8 = uint(i) fmt.Printf("%b", u)
Ini menghasilkan 11111011, tepatnya pelengkap Two's -5.
Oleh itu, perwakilan dalaman integer yang ditandatangani dalam Go mematuhi konvensyen pelengkap Two's. Perwakilan binari yang kelihatan tidak betul apabila memformatkan integer bertandatangan terhasil daripada penukaran automatik dan pendahuluan tanda yang dilakukan oleh fmt.integer. Memahami gelagat ini adalah penting apabila bekerja dengan integer yang ditandatangani dan perwakilan binari dalam Go.
Atas ialah kandungan terperinci Mengapakah fmt.Printf menunjukkan perwakilan binari yang berbeza untuk integer negatif daripada yang dijangkakan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!