Rumah > pembangunan bahagian belakang > Golang > Mengapa fmt.Printf Output \'-101\' Apabila Mencetak Perwakilan Perduaan Integer Ditandatangani dalam Go?

Mengapa fmt.Printf Output \'-101\' Apabila Mencetak Perwakilan Perduaan Integer Ditandatangani dalam Go?

Barbara Streisand
Lepaskan: 2024-11-02 07:28:29
asal
406 orang telah melayarinya

Why Does fmt.Printf Output

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

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

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 &amp;&amp; a < 0
   166      if negative {
   167          a = -a
   168      }
Salin selepas log masuk

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!

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