Bagaimana cara nilai-nilai bertanda negatif disimpan?

13

Saya menonton video ini pada nilai maksimum dan minimum dari bilangan bulat yang ditandatangani.

Ambil contoh nilai bertanda positif - 0000 0001 Bit pertama menunjukkan bahwa angka tersebut positif dan 7 bit terakhir adalah angka itu sendiri. Sehingga mudah diartikan sebagai +1.

Sekarang ambil contoh nilai ditandatangani negatif - 1000 0000 yang keluar menjadi -8. Oke, komputer dapat memahami bahwa ini adalah nilai negatif karena bit pertama tetapi bagaimana sih yang mengerti bahwa 000 0000 berarti -8?

Secara umum, bagaimana nilai-nilai bertanda negatif disimpan / diinterpretasikan dalam komputer?

dibahas tiga
sumber
nl.wikipedia.org/wiki/Two%27s_complement adalah cara nomor biner disimpan di komputer.
Pieter B
@PieterB Mungkin komputer Anda. Dan banyak orang lain. Untuk alasan yang bagus! Tapi jangan menyiratkan itu satu-satunya cara.
underscore_d
Apa pun yang Anda suka. Saya bisa memikirkan setidaknya 256! cara menyimpan (8 bit) nomor biner di komputer. Namun kebanyakan dari mereka sangat konyol.
Caleth
C tidak menentukan, sebagian besar bagaimana produsen chip memutuskan untuk mewakili data. C dikompilasi ke kode mesin, dan perlu berhati-hati untuk tidak mendefinisikan kembali bagaimana chip menyimpan angka. Aturan yang sama berlaku untuk angka floating point. Terserah produsen chip untuk menentukan bagaimana mereka disimpan. Sebagian besar produsen chip menggunakan komplemen 2's, tapi saya yakin ada pengecualian.
Berin Loritsch

Jawaban:

29

Standar C tidak mengamanatkan cara tertentu untuk mewakili angka bertanda negatif.

Dalam sebagian besar implementasi yang mungkin Anda temui, bilangan bulat bertanda negatif disimpan dalam apa yang disebut pelengkap dua . Cara utama lainnya untuk menyimpan angka bertanda negatif disebut pelengkap seseorang .

Komplemen dua angka N-bit xdidefinisikan sebagai 2^N - x. Sebagai contoh, komplemen keduanya 8-bit 1adalah 2^8 - 1, atau 1111 1111. Kedua komplemen dari 8-bit 8adalah 2^8 - 8, yang dalam biner 1111 1000. Ini juga dapat dihitung dengan membalik bit xdan menambahkan satu. Sebagai contoh:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

Komplemen seseorang dari angka N-bit x didefinisikan sebagai x dengan semua bitnya dibalik, pada dasarnya.

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

Pelengkap dua memiliki beberapa keunggulan dibandingkan pelengkap seseorang. Misalnya, tidak memiliki konsep 'nol negatif', yang karena alasan yang baik membingungkan banyak orang. Penambahan, perkalian dan pengurangan bekerja sama dengan bilangan bulat yang ditandatangani diimplementasikan dengan dua bilangan bulat yang dilengkapi dengan bilangan bulat yang tidak ditandatangani juga.

Miles Rout
sumber
19

Ada tiga metode terkenal untuk mewakili nilai negatif dalam biner:

  1. Ditandatangani besarnya . Ini adalah yang termudah untuk dipahami, karena berfungsi sama seperti yang biasa kita gunakan ketika berhadapan dengan nilai desimal negatif: Posisi pertama (bit) mewakili tanda (0 untuk positif, 1 untuk negatif), dan bit lain mewakili angka . Meskipun mudah bagi kita untuk memahami, sulit bagi komputer untuk bekerja dengannya, terutama ketika melakukan aritmatika dengan angka negatif.
    Dalam 8-bit magnitude, nilai 8 direpresentasikan sebagai 0 0001000 dan -8 sebagai 1 0001000.

  2. Pelengkap seseorang . Dalam representasi ini, angka negatif dibuat dari angka positif yang sesuai dengan membalik semua bit dan bukan hanya bit tanda. Ini membuatnya lebih mudah untuk bekerja dengan angka negatif untuk komputer, tetapi memiliki komplikasi bahwa ada dua representasi berbeda untuk +0 dan -0. Membalikkan semua bit membuat ini lebih sulit untuk dipahami manusia.
    Dalam komplemen 8-bit seseorang, nilai 8 direpresentasikan sebagai 00001000 dan -8 sebagai 11110111.

  3. Dua komplemen . Ini adalah representasi paling umum yang digunakan saat ini untuk bilangan bulat negatif karena ini adalah yang termudah untuk bekerja dengan komputer, tetapi juga yang paling sulit dipahami oleh manusia. Ketika membandingkan pola bit yang digunakan untuk nilai negatif antara komplemen seseorang dan komplemen dua, dapat diamati bahwa pola bit yang sama dalam komplemen dua mengkodekan untuk angka yang lebih rendah berikutnya. Misalnya 11111111 berarti -0 dalam komplemen seseorang dan untuk -1 dalam komplemen dua, dan juga untuk 10000000 (-127 vs -128).
    Dalam komplemen 8-bit two, nilai 8 direpresentasikan sebagai 00001000 dan -8 sebagai 11111000.

Bart van Ingen Schenau
sumber
8
Signed magnitude juga memiliki dua nol.
Jörg W Mittag
+1 untuk menyebutkan tanda / besarnya. tidak umum dan tidak nyaman (untuk CPU jika bukan manusia!), tetapi perlu diketahui.
underscore_d
Hampir semua dari kita bekerja dengan magnitudo yang ditandatangani, terutama dengan nomor FP.
Paulo1205
2

Bilangan bulat yang ditandatangani disimpan menggunakan http://en.wikipedia.org/wiki/Two%27s%20complement

Maka Anda mendapatkan:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

Pada dasarnya ini adalah penghitungan yang sangat mudah, Anda menghitung hingga setengah maks integer yang ditandatangani. Lakukan +1, membuatnya negatif dan mulai menghitung mundur.

Pieter B
sumber