Mengapa nilai minimum int, dobel, dll 1 lebih jauh dari nol daripada nilai positif?

10

Saya tahu ini ada hubungannya dengan komplemen 2 dan menambahkan 1, tapi saya tidak benar-benar mengerti bagaimana Anda dapat menyandikan satu nomor lagi dengan jumlah bit yang sama ketika datang ke angka negatif.

potongan kertas
sumber
3
Bagian yang benar-benar buruk dari ini adalah Abs (MinValue) negatif.
OldFart
1
di java Double.MIN_VALUE adalah nilai positif terkecil , dan angka (nyata) terjauh dari nol memiliki besaran yang sama (karena memiliki bit tanda yang tepat)
ratchet freak

Jawaban:

16

Pikirkan hal ini dalam istilah-istilah ini. Ambil nomor 2-bit dengan tanda sebelumnya:

000 = 0
001 = 1
010 = 2
011 = 3

Sekarang mari kita memiliki beberapa negatif:

111 = -1
110 = -2
101 = -3

Tunggu, kami juga punya

100 ... 

Itu harus negatif, karena tanda-bit adalah 1. Jadi, secara logis, itu harus -4.

(Sunting: Seperti WorldEngineer tunjukkan dengan benar , tidak semua sistem penomoran bekerja seperti ini - tetapi yang Anda tanyakan tentang lakukan.)

pdr
sumber
11

Karena tidak ada dua kelas angka dalam rentang bilangan bulat, tetapi tiga: angka negatif, nol, dan angka positif. Nol harus mengambil slot (akan menjadi agak tidak praktis untuk tidak dapat mewakili nol ...), sehingga kelas positif atau negatif harus memberikan slot. Fakta bahwa biasanya rentang positif yang harus membuat pengorbanan itu sampai batas tertentu sewenang-wenang, tetapi pada tingkat manipulasi bit ada beberapa hal yang membuat keputusan ini lebih nyaman.

Kilian Foth
sumber
Ini bukan hanya manipulasi bit. Himpunan angka bertanda 32-bit adalah himpunan angka yang representasi binernya memiliki nilai yang sama dalam semua bit setelah tanggal 31, dan satu angka tersebut memiliki himpunan yang tak terbatas diikuti oleh 31 angka nol. Kebalikan aditif dari angka itu, string nol tanpa batas diikuti oleh nol 1 dan 31 tunggal, tidak cocok dengan pola yang diperlukan dari nilai yang ditandatangani.
supercat
4

Pada dasarnya ada tiga cara untuk mewakili bilangan bulat yang ditandatangani dalam biner: komplemen 2, komplemen 1, dan magnitudo tanda. (Biquinary pergi ke jalan Dodo Bird sejak lama.)

Komplemen dan sign-magnitude 1 memiliki dua nilai nol, +0 dan -0, masing-masing dengan representasi unik. Komplemen 2 hanya memiliki satu nilai nol, dan satu representasi.

Sekarang, bidang N bit dapat mengkodekan nilai 2 ^ N. Kurangi satu dalam komplemen 2, dan Anda memiliki 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1. Karena representasi untuk nol adalah semua nol bit, dan tanda + adalah nol, akan ada satu lagi representasi bukan nol yang mungkin dengan bit tanda diatur ke 1.

Ini adalah cara yang sangat panjang untuk mengatakan komplemen 2's mewakili nilai dalam kisaran - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1).

Komplemen 1 sebenarnya memiliki keunggulan dibandingkan komplemen 2 jika Anda melakukan perhitungan pemrosesan sinyal digital bilangan bulat. Operasi komplemen 1 secara inheren terpotong menuju nol. Pelengkap 2 memotong menuju -infinity. Saya belajar yang satu ini dengan KERAS ...

John R. Strohm
sumber