it-swarm-id.com

Bagaimana cara mengetahui jika angka integral biner mewakili angka negatif?

Saya membaca beberapa teks C. Dalam sesi Nilai Negatif dan Positif, penulis menyebutkan beberapa cara untuk mewakili angka negatif dalam bentuk biner.

Saya mengerti sepenuhnya dan bertanya-tanya apakah dengan angka biner, dapatkah kita menentukan apakah itu negatif?

Sebagai contoh, -92 memiliki bentuk biner 8-bit: 10100100. Tetapi jika kita diberi 10100100 dapatkah kita mengatakan bahwa -92, dan bukan angka non-negatif lainnya?

19
ipkiss

Itu tergantung pada representasi, tentu saja. Dalam komplemen dua, yang banyak digunakan, Anda cukup melihat bit yang paling signifikan.

16
Tom Zych

Sebagai contoh, (angka) -92 memiliki bentuk biner: 10100100 (dalam representasi 8 bit byte). Tetapi jika kita diberi 10100100, dapatkah kita mengatakan bahwa -92, dan bukan angka non-negatif lainnya?

Tidak, Anda harus tahu sebelumnya apakah penyimpanan yang bertanda tangan atau tidak bertanda telah digunakan untuk menyimpan nomor tersebut, dan Anda juga perlu mengetahui penyandian yang digunakan untuk menyimpan nomor tersebut.

Jika bilangan bulat 8-bit (yaitu byte) ditandatangani, maka sesuai Tom dan 32bitkid, bilangan bulat yang ditandatangani biasanya disimpan di 2's melengkapi , di mana Bit Paling Signifikan (MSB) akan menentukan apakah suatu angka negatif atau tidak.

misalnya Dalam contoh Anda, byte 10100100 dapat mewakili byte yang ditandatangani -92, karena:

MSB : 1 means negative
Other 7 Bits 0100100 
Flip and add 1 => 1011011 + 1 = 1011100
From powers of two, right to left : 
0*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4 + 0*2^5 + 1*2^6
= 4 + 8 + 16 + 64 
= 92 (and thus -92 because of the MSB)

ATAU jika nilainya adalah byte yang tidak ditandatangani, maka MSB hanya diperlakukan sebagai kekuatan 2 berikutnya, sama seperti semua bit yang lebih rendah, mis. 10100100 dapat mewakili:

(Sekali lagi, kekuatan dua, kanan ke kiri, dan menghilangkan kekuatan 0 dua)

4 + 32 + 128 
= 164

Keputusan tentang apakah bilangan bulat harus ditandatangani atau tidak pada umumnya ditentukan oleh rentang nilai yang perlu Anda simpan di dalamnya. Misalnya, integer bertanda 32 bit dapat mewakili kisaran:

–2147483648 to 2147483647

Sedangkan integer 32 bit yang tidak ditandatangani dapat mewakili angka dari

0 to 4294967295
11
StuartLC

Anda ingin membaca di komplemen dua angka. Singkatnya, bit yang paling signifikan dapat digunakan untuk menentukan apakah jumlahnya negatif.

Saya membaca ulang pertanyaan Anda dan Anda mengatakan Anda sudah memahami komplemen dua. Ketika berhadapan dengan angka negatif, jumlah bit harus diketahui untuk menentukan apakah angka itu negatif atau tidak. Angka negatif harus diperpanjang dengan jumlah bit yang diperlukan. Contoh Anda -92 saat disimpan dalam 32 bit adalah 11111111111111111111111110100100100.

6
bw1024

Jika Anda memiliki nilai dalam memori, masukkan ke tanda yang masuk dalam ukuran yang sama dan uji apakah nilainya kurang dari nol. Jadi, if ((int)value < 0).

Jika Anda mencoba untuk menguraikan konstanta biner dari sebuah string, Anda perlu mengetahui format angka tersebut. Namun, dua komplemen telah universal selama lima puluh tahun sekarang. (Satu-satunya pengecualian adalah dukungan biner yang kompatibel untuk mainframe Unisys lama tertentu yang masih digunakan.) Untuk itu, Anda hanya perlu melihat bit pertama (seperti jawaban yang diterima mengatakan).

0
Davislor

Anda harus mengetahui jenis (bertanda/tidak) dari nomor tersebut untuk menentukan angka negatif/positif. Jika jenis tidak disebutkan maka secara default ditandatangani. Jika ditandatangani maka Anda dapat melihat bit MSB untuk menentukan tidak atau tidak positif. Jika disebutkan sebagai unsigned maka Anda harus menghitung bit MSB untuk membuat desimal.

0
user3427258