Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Barbara Streisandasal
2024-11-02 07:28:29349semak imbas

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)

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 &amp;&amp; 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!

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