Rumah > pembangunan bahagian belakang > Golang > Mengapa fmt.Printf Memaparkan Perwakilan Perduaan Tidak Betul untuk Integer Ditandatangani dalam Go?

Mengapa fmt.Printf Memaparkan Perwakilan Perduaan Tidak Betul untuk Integer Ditandatangani dalam Go?

Susan Sarandon
Lepaskan: 2024-11-03 11:29:29
asal
285 orang telah melayarinya

Why Does fmt.Printf Display Incorrect Binary Representations for Signed Integers in Go?

Percanggahan antara Two's Complement dan fmt.Printf

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan