Rumah >pembangunan bahagian belakang >Golang >Mengapa fmt.Printf Memaparkan Perwakilan Perduaan Tidak Betul untuk Integer Ditandatangani dalam Go?
Soalan Asal:
Apabila cuba mencetak perwakilan binari integer yang ditandatangani, fmt.Printf menghasilkan output yang berbeza daripada nilai komplemen Two yang dijangkakan.
Analisis:
Two's complement ialah teknik yang digunakan oleh komputer untuk mewakili dalaman yang ditandatangani integer. Sebagai contoh, -5 akan diwakili sebagai 1111 1011. Walau bagaimanapun, fmt.Printf, apabila digunakan dengan integer yang ditandatangani, menghasilkan hasil yang tidak dijangka. Walau bagaimanapun, penukaran kepada integer yang tidak ditandatangani akan menghasilkan perwakilan binari yang betul.
Penjelasan:
Tingkah laku yang diperhatikan bukan disebabkan oleh perwakilan dalaman integer. Sebaliknya ia adalah hasil daripada cara fmt.Printf memformat nombor perduaan.
Fungsi fmt.integer, yang digunakan oleh fmt.Printf, menukar integer bertanda negatif kepada nilai positif sebelum memformat. Ini menyebabkan nilai perduaan nilai mutlak ditambah dengan tanda -.
Contoh:
<code class="go">var i int8 = -5 fmt.Printf("%b", i) // Outputs: -101 (Incorrect)</code>
Dalam contoh ini, -5 ditukar kepada 5 dalam perduaan, yang kemudiannya ditambah dengan ., menghasilkan -101.
Penyelesaian:
Untuk mendapatkan perwakilan binari yang betul bagi integer yang ditandatangani, seseorang boleh menukar ia kepada integer yang tidak ditandatangani dan kemudian gunakan fmt.Printf untuk mencetak perwakilan binari.
<code class="go">var i int8 = -5 var u uint8 = uint8(i) fmt.Printf("%b", u) // Outputs: 1111 1011 (Correct)</code>
Atas ialah kandungan terperinci Mengapa fmt.Printf Memaparkan Perwakilan Perduaan Tidak Betul untuk Integer Ditandatangani dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!