bitlvl
SR

Konvertor dvojičnog komplementa

Unesite decimalni broj (može i negativan), ili binarni ili heks obrazac bitova, i vidite kako se čuva i čita u širini koju izaberete.

Širina
Bit znaka

Rezultati i poruke ovog alata prikazuju se na engleskom.

Kako radi dvojični komplement

Računari nemaju znak minus, samo bitove. Dvojični komplement je konvencija koju gotovo svaki CPU koristi za čuvanje negativnih celih brojeva: najviši bit (bit znaka) vredi negativnih 2ⁿ⁻¹ umesto pozitivnih. U 8 bitova najviši bit vredi −128, pa je 1111 1111 = −128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = −1, a 1000 0000 je −128.

Isti bitovi pročitani bez znaka su 255 i 128. Da li je vrednost „zaista“ negativna odlučuje tip u vašem kodu (int8_t naspram uint8_t), a ne bitovi. Zato ovaj alat uvek prikazuje oba čitanja.

Ručna negacija broja

  1. Napišite pozitivnu vrednost binarno u punoj širini (42 = 0010 1010).
  2. Obrnite svaki bit (1101 0101).
  3. Dodajte 1 (1101 0110). To je −42, odnosno 0xD6 ili 214 bez znaka.

Trik radi u oba smera: primenjen na −42 vraća 42. Alat iznad ispisuje ove korake za šta god unesete.

Zašto je ovako osmišljen

Sa dvojičnim komplementom hardveru ne treba poseban oduzimač. Sabiranje negativnog broja je obično binarno sabiranje pri kome se prenos iz najvišeg bita odbacuje: 42 + (−42) = 0010 1010 + 1101 0110 = 1 0000 0000, odbacite deveti bit i dobijate 0. Postoji i samo jedna nula, za razliku od zapisa znak-apsolutna vrednost ili jediničnog komplementa.

Opsezi

ŠirinaOpseg sa znakomOpseg bez znakaTipičan tip
8−128 … 1270 … 255int8_t, byte
16−32.768 … 32.7670 … 65.535int16_t, short
32−2.147.483.648 … 2.147.483.6470 … 4.294.967.295int32_t, int
64−9,22 × 10¹⁸ … 9,22 × 10¹⁸0 … 1,84 × 10¹⁹int64_t, long

Negativni opseg je za jedan veći od pozitivnog, jer nula zauzima jedan od „pozitivnih“ obrazaca. Zato -INT_MIN prekoračuje: 128 ne staje u bajt sa znakom.

Pitanja

Koliko je −1 u dvojičnom komplementu?

Sve jedinice: 0xFF u 8 bitova, 0xFFFF u 16, 0xFFFFFFFF u 32. Obrtanje 0000 0001 daje 1111 1110, dodavanje 1 daje 1111 1111.

Kako da znam da li je binarni broj negativan?

Pogledajte krajnji levi bit u deklarisanoj širini. Ako je 1 i vrednost je sa znakom, broj je negativan. 1000 0000 je −128 kao int8, ali 128 kao uint8; sami bitovi ne odlučuju.

Zašto 127 + 1 daje −128?

Prekoračenje sa znakom. 0111 1111 + 1 = 1000 0000, što postavlja bit znaka. U C-u je to nedefinisano ponašanje; u većini drugih jezika vrednost se prelama na −128.

Šta je proširenje znaka?

Proširivanje vrednosti sa znakom kopiranjem bita znaka u nove gornje bitove, tako da −1 (0xFF) postaje 0xFFFF, a ne 0x00FF. Kastovanje int8 u int16 to radi automatski; kastovanje neoznačenog umesto toga radi proširenje nulama. Promenite širinu iznad sa unetim negativnim brojem da to vidite.

Da li je bit znaka samo zastavica?

Ne. U dvojičnom komplementu bit znaka ima vrednost (−2ⁿ⁻¹) i učestvuje u aritmetici. To se razlikuje od zapisa znak-apsolutna vrednost, gde najviši bit samo označava znak, i od pokretnog zareza, gde je znak zasebna zastavica.