Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah fmt.Printf menunjukkan perwakilan binari yang berbeza untuk integer negatif daripada yang dijangkakan dalam Go?

Mengapakah fmt.Printf menunjukkan perwakilan binari yang berbeza untuk integer negatif daripada yang dijangkakan dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 16:11:02143semak imbas

Why does fmt.Printf show a different binary representation for negative integers than expected in 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!

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