Rumah > Artikel > pembangunan bahagian belakang > Mengapa fmt.Printf Output \"-101\" Apabila Mencetak Perwakilan Perduaan Integer Ditandatangani dalam Go?
Two's Complement and the Puzzling Output of fmt.Printf
Dalam bidang sains komputer, Two's complement ialah kaedah lazim yang digunakan untuk mewakili integer yang ditandatangani secara dalaman. Perwakilan ini melibatkan membalikkan bit dan menambah satu untuk menyatakan nombor negatif. Sebagai contoh, dalam pelengkap Two, -5 akan diwakili dalam format perduaan sebagai "1111 1011" (bersamaan dengan ^5 1).
Kebingungan timbul apabila cuba mencetak perwakilan binari integer yang ditandatangani menggunakan fmt.Printf . Pertimbangkan coretan kod berikut:
var i int8 = -5 fmt.Printf("%b", i)
Dijangkakan, kod ini akan mengeluarkan "1111 1011," perwakilan pelengkap Dua bagi -5. Walau bagaimanapun, output sebenar ialah "-101," yang menyimpang daripada jangkaan ini. Ini menimbulkan persoalan: adakah nilai disimpan secara dalaman dalam format pelengkap Two, atau adakah perwakilan berbeza digunakan?
Menariknya, menukar nilai kepada integer yang tidak ditandatangani sebelum mencetaknya menghasilkan hasil yang diingini:
var u uint8 = uint(i) fmt.Printf("%b", u)
Ini menghasilkan output "11111011," perwakilan pelengkap Dua tepat -5.
Inti percanggahan terletak pada cara fmt.Printf mengendalikan pemformatan nombor binari. Setelah memeriksa dengan lebih dekat fungsi fmt.integer, menjadi jelas bahawa integer bertanda negatif ditukar kepada positif semasa proses pemformatan:
165 negative := signedness == signed && a < 0 166 if negative { 167 a = -a 168 }
Penukaran ini memerlukan penambahan awalan '-' pada rentetan terformat, yang menerangkan output "-101" yang diperhatikan sebelum ini.
Pada dasarnya, perwakilan dalaman nilai mematuhi konvensyen pelengkap Dua, manakala proses pemformatan dalam fmt.integer menukar integer bertanda negatif kepada rakan sejawatannya yang positif, membawa kepada output yang tidak dijangka.
Atas ialah kandungan terperinci Mengapa fmt.Printf Output \"-101\" Apabila Mencetak Perwakilan Perduaan Integer Ditandatangani dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!