Skip to content

Kalkulator Komplemen Dua & Encoding Bilangan Bertanda

Masukkan bilangan bulat bertanda untuk mendapat sign-magnitude, komplemen satu, komplemen dua, dan biner offset pada lebar 4-64 bit. Atau tempel pola bit atau heks dan lihat kelima pembacaannya. Gratis dan lokal di browser.

Tanpa Pelacakan Berjalan di Browser Gratis
Semuanya dihitung secara lokal di browser Anda — tidak ada yang Anda ketik diunggah.
Lebar bit

Desimal ke representasi mesin

Ketik bilangan bulat bertanda. Keempat representasi dihitung sekaligus — Anda tidak perlu tahu lebih dulu yang mana yang dipakai sistem Anda.

Coba yang ini
Encoding Bit Heks
Sign-magnitude 1000 0101 85
Komplemen satu 1111 1010 FA
Komplemen dua 1111 1011 FB
Biner offset 0111 1011 7B

Pola bit ke nilai

Anda menemukan sebuah byte di memory dump atau register dan tidak tahu bagaimana seharusnya ia dibaca. Tempel dan lihat artinya di bawah setiap tafsir sekaligus — yang mana yang benar bergantung pada sistem yang menghasilkannya, jadi semuanya ditampilkan.

Dibaca sebagai Nilai
Tak bertanda 251
Sign-magnitude -123
Komplemen satu -4
Komplemen dua -5
Biner offset 123
Tabel rujukan 8 bit

Dihitung oleh mesin yang sama dengan yang dipakai alat di atas, jadi nilai-nilai ini tidak mungkin melenceng darinya.

Desimal Sign-magnitude Komplemen satu Komplemen dua Biner offset Heks
127 0111 1111 0111 1111 0111 1111 1111 1111 7F
100 0110 0100 0110 0100 0110 0100 1110 0100 64
10 0000 1010 0000 1010 0000 1010 1000 1010 0A
5 0000 0101 0000 0101 0000 0101 1000 0101 05
1 0000 0001 0000 0001 0000 0001 1000 0001 01
0 0000 0000 0000 0000 0000 0000 1000 0000 00
-1 1000 0001 1111 1110 1111 1111 0111 1111 FF
-5 1000 0101 1111 1010 1111 1011 0111 1011 FB
-10 1000 1010 1111 0101 1111 0110 0111 0110 F6
-100 1110 0100 1001 1011 1001 1100 0001 1100 9C
-127 1111 1111 1000 0000 1000 0001 0000 0001 81
-128 1000 0000 0000 0000 80
Rentang nilai menurut lebar bit
Lebar Komplemen dua / biner offset Sign-magnitude / komplemen satu
4 -8 … 7 -7 … 7
8 -128 … 127 -127 … 127
16 -32768 … 32767 -32767 … 32767
32 -2147483648 … 2147483647 -2147483647 … 2147483647
64 -9223372036854775808 … 9223372036854775807 -9223372036854775807 … 9223372036854775807
Setiap encoding diuji dalam suite pengujian pada kelima lebar bit, termasuk seluruh rentang 4 bit, kedua pola nol, dan nilai paling negatif pada tiap lebar. Hasil 64 bit diperiksa silang terhadap BigInt.asIntN dan BigInt.asUintN milik JavaScript sendiri. — Tim Go Tools · Sep 9, 2026

Dibangun dan diverifikasi oleh tim teknik Go Tools.

Jawaban singkat

Berapa −5 dalam komplemen dua 8 bit?

11111011 11111011, yaitu 0xFB.

Berapa rentang sebuah byte bertanda?

-128 … 127 −128 sampai 127 pada komplemen dua; −127 sampai 127 pada sign-magnitude dan komplemen satu.

Bagaimana mengubah pola komplemen dua kembali menjadi bilangan?

nilai − 2^n Jika bit teratasnya 0, baca sebagai tak bertanda; jika 1, kurangi pembacaan tak bertandanya dengan 2^n.

Apakah 0xFF berarti −1 atau 255?

−1 atau 255 −1 sebagai byte bertanda, 255 sebagai byte tak bertanda. Bitnya sendiri tidak menentukan.

Apa itu komplemen dua?

Komplemen dua menjawab pertanyaan perangkat keras, bukan pertanyaan matematika: bagaimana menyimpan bilangan negatif supaya penjumlah yang sudah terlanjur Anda bangun tetap bekerja? Triknya adalah merepresentasikan −x dengan pola untuk 2^n − x. Penjumlahan lalu berputar modulo 2^n dan mendarat pada jawaban yang benar tanpa kasus khusus untuk tanda, dan karena itu pengurangan tidak memerlukan rangkaian tersendiri.

Dua akibat mengikutinya dan keduanya muncul dalam bug nyata. Pertama, rentangnya tidak simetris: delapan bit mencakup −128 sampai 127, bukan −128 sampai 128, karena polanya harus dibagi habis dan tidak ada nol negatif yang menggenapkan kedua sisi. Kedua, tanda bukanlah bendera yang bisa Anda copot — bit teratas 11111011 bernilai 1, tetapi nilainya −5 dan bukan −123, jadi membaca bilangan negatif berarti menafsirkan seluruh word, bukan menengok satu bit saja.

Sign-magnitude dan komplemen satu adalah dua rancangan yang kalah bersaing. Keduanya tetap layak diketahui karena floating point IEEE 754 mempertahankan tata letak sign-magnitude, dan karena perbandingan itulah yang membuat komplemen dua tampak niscaya alih-alih sekadar sewenang-wenang.

// -5 as an 8-bit byte, three ways to arrive at the same pattern
0b00000101        // 5
~0b00000101       // 11111010  ones' complement of 5
~0b00000101 + 1   // 11111011  two's complement = -5

// In JavaScript the width matters: bitwise operators are 32-bit,
// so anything wider has to go through BigInt.
BigInt.asIntN(8, 0xFBn)                 // -5n
BigInt.asUintN(8, -5n)                  // 251n
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn)  // -5n

// C23 made two's complement mandatory for signed integers.
// Before that, the other two encodings were legal but unused.

Apa yang dikerjakan kalkulator ini

Empat encoding sekaligus

Sign-magnitude, komplemen satu, komplemen dua, dan biner offset dihitung bersamaan. Biner offset adalah yang paling sering ditinggalkan kalkulator lain, dan justru itulah yang terus dipakai lembar data ADC.

Pembacaan balik dari pola bit

Tempel bit atau heks yang benar-benar Anda punya dan lihat kelima pembacaannya, termasuk yang tak bertanda. Inilah arah yang Anda butuhkan ketika sebuah dump berselisih dengan angka yang dilaporkan perangkat.

Benar pada 64 bit

Setiap nilai ditangani dengan BigInt, sehingga 0xFFFFFFFFFFFFFF9C menghasilkan −100 alih-alih apa pun yang keluar dari pemangkasan 32 bit.

Jujur soal yang tidak punya representasi

Pada lebar 8, −128 tidak punya bentuk sign-magnitude maupun komplemen satu. Tabelnya mengatakan demikian alih-alih mencetak pola yang tidak berarti bilangan itu.

Nol negatif dibuat terlihat

Masukkan 0 dan pola bit kedua untuk nol pada sign-magnitude dan komplemen satu akan ditampilkan — argumen tunggal paling jelas tentang mengapa komplemen dua menang.

Tabel rujukan tanpa JavaScript

Tabel perbandingan 8 bit dan rentang per lebar dirender saat halaman dibangun, oleh mesin yang sama dengan yang menggerakkan kolom interaktif di atas, sehingga keduanya tidak mungkin melenceng satu sama lain.

Perbandingan dengan cara pemeriksaan lain

Konversi bawaan bahasa Anda

API runtime

BigInt.asIntN, int.from_bytes(..., signed=True) milik Python, dan tipe lebar tetap di C memberi jawaban otoritatif untuk kode yang sedang Anda tulis. Pakai itu di dalam kode; pakai halaman ini ketika sebuah nilai ada di depan Anda dan tidak ada interpreter yang terbuka.

Tampilan memori pada debugger

Fitur IDE

Ia menampilkan nilai dengan tipe yang dideklarasikan program, yaitu persis potongan informasi yang tidak dimiliki sebuah pola bit. Ia tidak menolong ketika byte-nya datang lewat kabel tanpa tipe yang dideklarasikan — dan justru kasus itulah yang ditangani halaman ini.

Ia mengonversi antarbasis, tetapi hanya untuk nilai non-negatif — bilangan negatif ditolak secara eksplisit di sana karena sebuah basis tidak punya pendapat tentang bagaimana tanda disimpan. Representasi bertanda adalah tugas halaman ini; pakai konverter basis untuk besarannya.

Konverter IEEE 754

Situs ini

Padanannya di sisi floating point. Ia mempertahankan tata letak sign-magnitude alih-alih komplemen dua, dan membiaskan eksponennya dengan 2^(e−1)−1, sehingga kedua halaman menjawab pertanyaan yang berbeda tentang satu word memori yang sama.

Contoh perhitungan

−5 sebagai satu byte 8 bit

-5, lebar 8
sign-magnitude   1000 0101
komplemen satu   1111 1010
komplemen dua    1111 1011  (0xFB)
biner offset     0111 1011

Ketiga encoding sepakat pada bit tanda dan berbeda pada segala hal lain. Hanya baris komplemen dua yang benar-benar disimpan oleh int8_t di C.

Byte 0xFB dibaca dengan lima cara

0xFB, lebar 8
tak bertanda     251
sign-magnitude   -123
komplemen satu   -4
komplemen dua    -5
biner offset     123

−128 tidak punya bentuk sign-magnitude

-128, lebar 8
sign-magnitude   tidak ada representasi
komplemen satu   tidak ada representasi
komplemen dua    1000 0000  (0x80)
biner offset     0000 0000

Sign-magnitude dan komplemen satu masing-masing menghabiskan satu pola bit untuk nol negatif, sehingga rentangnya −127 sampai 127 dan tidak sampai ke −128. Alat yang mencetak sebuah byte di sini keliru.

Sebuah nilai register 64 bit

0xFFFFFFFFFFFFFF9C, lebar 64
komplemen dua    -100
tak bertanda     18446744073709551516

Apa pun yang lebih lebar dari 32 bit harus dikerjakan dengan BigInt. Operator |, <<, dan >>> di JavaScript memangkasnya ke 32 bit tanpa suara, dan itulah sebabnya sebagian kalkulator daring memberi jawaban salah di sini alih-alih menampilkan galat.

Cara memakai kalkulator komplemen

  1. 1

    Pilih lebar bit

    4, 8, 16, 32, atau 64. Ini bukan preferensi tampilan — bit yang sama berarti bilangan yang berbeda pada lebar yang berbeda, jadi salah memilih akan mengubah jawabannya.

  2. 2

    Masukkan desimal bertanda

    Ketik bilangan bulat, lengkap dengan tanda minusnya. Keempat encoding diperbarui sambil Anda mengetik, berikut bentuk heksadesimal masing-masing.

  3. 3

    Atau berjalan mundur dari bit

    Tempel string biner atau nilai 0x ke kolom pembacaan balik untuk melihat arti pola itu di bawah setiap tafsir, termasuk pembacaan tak bertanda.

  4. 4

    Baca catatan yang muncul

    Halaman ini menandai dua kasus yang paling sering menjegal orang: nilai paling negatif yang tidak punya bentuk sign-magnitude maupun komplemen satu, dan nol yang punya pola bit kedua pada dua encoding tersebut.

Kesalahan yang menghasilkan jawaban salah

Lupa menambahkan +1

Membalik bitnya menghasilkan komplemen satu. Berhenti di situ membuat hasilnya meleset satu dari komplemen dua, dan kesalahan ini mudah terlewat karena hasilnya masih tampak seperti bilangan negatif yang masuk akal.

✗ Salah
5   = 00000101
~5  = 11111010   <- ones' complement, not -5
✓ Benar
5        = 00000101
~5       = 11111010
~5 + 1   = 11111011   <- -5 in two's complement

Memakai operator bitwise 32 bit pada nilai 64 bit

JavaScript memangkas operand operator bitwise ke 32 bit. Separuh atasnya lenyap tanpa galat, jadi hasilnya salah alih-alih tidak ada.

✗ Salah
0xFFFFFFFFFFFFFFFB        // 18446744073709552000  -- the literal is already rounded
~0xFFFFFFFFFFFFFFFB + 1   // 0  -- silently wrong, expected -5
✓ Benar
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn)   // -5n

Melebarkan nilai negatif dengan nol

Melebarkan dengan mengisi nol hanya mempertahankan bilangannya ketika ia positif. Untuk nilai negatif, bit tanda harus digandakan ke seluruh bit baru.

✗ Salah
int8  0xFB  (-5)
int16 0x00FB  (251)   <- zero-extended
✓ Benar
int8  0xFB  (-5)
int16 0xFFFB  (-5)    <- sign-extended

Memberi nilai paling negatif sebuah bentuk sign-magnitude

−128 tidak punya representasi sign-magnitude maupun komplemen satu dalam delapan bit, karena kedua encoding itu menghabiskan satu pola untuk nol negatif. Mencetak 10000000 untuknya berarti mengacaukan jawaban komplemen dua dengan encoding yang tidak sanggup menyatakan bilangan itu.

✗ Salah
-128 sign-magnitude: 10000000   <- that pattern means -0
✓ Benar
-128 sign-magnitude: no representation at width 8
-128 two's complement: 10000000

Kapan ini benar-benar dibutuhkan

Membaca register sensor
Sebuah register suhu mengembalikan 0xFF9C. Sebagai tak bertanda itu 65436, yang jelas bukan suhu. Pada lebar 16 baris komplemen dua menunjukkan −100, dan dengan faktor skala 0,1 °C sensor itu sedang memberi tahu Anda −10,0 °C.
Membedah protokol dengan field tanpa tipe
Modbus, CAN, dan sebagian besar telemetri biner mengangkut word mentah tanpa keterangan bertanda atau tidak. Ketika klien dan perangkat berselisih tentang sebuah nilai, memeriksa kedua pembacaan word yang sama biasanya menunjukkan sisi mana yang salah berasumsi.
Tugas kuliah organisasi komputer
Sign-magnitude, komplemen satu, komplemen dua, dan biner offset adalah empat serangkai baku di mata kuliah pengantar. Menaruhnya berdampingan pada lebar yang sama membuat perbedaannya terlihat, bukan sekadar dihafal.
Mengejar integer overflow
Ketika sebuah pencacah melompat dari 2147483647 ke −2147483648, melihat keduanya sebagai pola 32 bit memperlihatkan bahwa carry mendarat di bit tanda. Nilainya tidak berubah jadi omong kosong; ia berputar persis seperti yang dikatakan encoding-nya.
Menulis kode serialisasi
Sebelum memercayai encoder tulisan tangan, uji satu nilai negatif pada tiap lebar terhadap halaman ini. Kesalahan tanda mudah tertulis dan menghasilkan keluaran yang tampak rapi secara struktur sampai bilangan negatif sungguhan tiba.

Bagaimana keempat encoding dibentuk

Sign-magnitude
Bit teratas adalah tanda dan sisa n−1 bit adalah besarannya, dibaca sebagai bilangan tak bertanda biasa. Rentangnya −(2^(n−1)−1) sampai 2^(n−1)−1, simetris, dengan dua nol. Inilah tata letak yang dipakai IEEE 754 untuk floating point.
Komplemen satu
Nilai negatif adalah inversi bitwise dari besarannya, setara dengan 2^n − 1 − x. Rentang dan dua nolnya sama seperti sign-magnitude. Penjumlahannya memerlukan end-around carry, dan justru kerumitan itulah yang dihapus komplemen dua. Letak apostrof dalam ejaan Inggrisnya bukan salah ketik: ones' complement mengacu pada word berisi seluruhnya satu, sedangkan two's complement mengacu pada satu pangkat dua.
Komplemen dua
Nilai negatif −x disimpan sebagai 2^n − x. Rentangnya −2^(n−1) sampai 2^(n−1)−1, sengaja tidak simetris, dengan satu nol. Penjumlahan, pengurangan, dan perkalian word bawah semuanya tidak peduli tanda, dan itulah seluruh alasan ia menang.
Biner offset
Menyimpan value + 2^(n−1), sehingga −2^(n−1) menjadi seluruhnya nol dan polanya terurut dalam urutan yang sama dengan nilai yang diwakilinya. Ia setara dengan pola komplemen dua yang bit teratasnya dibalik. Hati-hati dengan penamaannya: field eksponen IEEE 754 berbias 2^(e−1)−1, satu lebih kecil daripada offset yang dipakai di sini.
Mengapa aritmetikanya memakai BigInt
JavaScript mengubah operand &, |, ~, dan operasi geser menjadi bilangan bulat 32 bit sebelum beroperasi lalu mengubahnya kembali sesudahnya, sehingga nilai 64 bit kehilangan separuh atasnya tanpa galat apa pun dimunculkan. Setiap konversi di halaman ini justru dikerjakan pada bilangan bulat presisi sembarang, dan itu pula sebabnya nilai ekstrem 64 bit keluar eksak.

Menangani nilai bertanda dengan benar

Tetapkan lebar sebelum hal lain
Sebuah pola bit tidak punya nilai sampai Anda menyebutkan seberapa lebar fieldnya. Sebagian besar perselisihan antara lembar data dan debugger berujung pada satu pihak mengasumsikan 16 bit dan pihak lain 32 bit.
Perlakukan nilai paling negatif sebagai kasus khusus
Menegasikannya meluap di setiap lebar — pada komplemen dua, −(−128) tetap −128 untuk byte bertanda. Kode apa pun yang menghitung nilai mutlak butuh rencana untuk masukan ini, dan setiap suite pengujian sebaiknya memuatnya.
Jangan pernah menyimpulkan tanda dari datanya
Tidak ada pemeriksaan atas bitnya yang bisa memberi tahu apakah sebuah field bertanda. Ambil informasi itu dari lembar data, skema, atau definisi struct; menebak akan berhasil sampai nilai negatif pertama muncul di produksi.
Lakukan perluasan tanda saat melebarkan
Menyalin 0xFB 8 bit ke field 16 bit sebagai 0x00FB mengubah −5 menjadi 251. Melebarkan nilai bertanda berarti menggandakan bit tandanya, sehingga hasilnya 0xFFFB.
Utamakan konversi bawaan bahasa
BigInt.asIntN di JavaScript, int.from_bytes(..., signed=True) di Python, dan tipe lebar tetap di C menyatakan maksudnya dengan jelas serta menangani kasus tepi. ~x + 1 buatan sendiri adalah asal muasal bug lebar bit.

Pertanyaan yang sering diajukan

Apa itu komplemen dua, dalam satu kalimat?
Itu konvensi yang menyimpan bilangan negatif −x sebagai pola bit untuk 2^n − x, sehingga pengurangan dan penjumlahan memakai rangkaian yang sama dan garis bilangan hanya punya satu nol.
Bagaimana cara menghitung komplemen dua secara manual?
Tulis besarannya dalam biner, balik setiap bit, lalu tambahkan 1. Untuk 5 dalam delapan bit: 000001011111101011111011. Langkah membalik saja sudah memberi komplemen satu, dan itulah sebabnya keduanya selalu terpaut satu.
Mengapa −128 muat dalam byte bertanda sementara +128 tidak?
Rentang komplemen dua memang sengaja tidak simetris. Dengan n bit ia mencakup −2^(n−1) sampai 2^(n−1)−1, karena ia tidak membuang satu pola untuk nol negatif seperti yang dilakukan sign-magnitude dan komplemen satu. Slot lebih itu jatuh di sisi negatif.
Apakah 11111011 sama dengan −5 atau 251?
Dua-duanya, dan bitnya sendiri tidak bisa memberi tahu yang mana. Jawabannya bergantung pada tipe yang dideklarasikan sistem yang menghasilkannya. Karena itu pembacaan balik di halaman ini menampilkan semua tafsir sekaligus alih-alih memilihkan satu untuk Anda — ambil baris yang cocok dengan int8_t atau uint8_t Anda.
Apa itu biner offset dan di mana saya akan menjumpainya?
Biner offset (disebut juga excess-K atau berbias) menyimpan value + 2^(n−1), sehingga nilai terkecil menjadi seluruhnya nol dan mengurutkan pola mentahnya sebagai bilangan tak bertanda juga mengurutkan nilai bertandanya. Ia muncul pada keluaran ADC dan DAC serta pada format sampel audio. Perhatikan bahwa eksponen IEEE 754 memakai bias yang berbeda — 2^(e−1)−1, bukan 2^(e−1) — jadi jangan membawa angkanya menyeberang.
Mengapa register Modbus terbaca 65436 padahal sensor menyebut −100?
Modbus mengangkut word 16 bit tanpa informasi tipe, sehingga klien yang mengasumsikan tak bertanda mencetak 65436 sementara yang dimaksud perangkat adalah nilai komplemen dua −100. Tempel 65436 sebagai heks 0xFF9C pada lebar 16 di sini, dan baris komplemen dua menunjukkan pembacaan yang dimaksudkan.
Apakah sign-magnitude dan komplemen satu masih dipakai?
Untuk bilangan bulat nyaris tidak — praktis semua CPU masa kini memakai komplemen dua, dan C23 akhirnya mewajibkannya. Keduanya tetap relevan karena floating point IEEE 754 mempertahankan tata letak sign-magnitude, dan karena keduanya masih muncul di soal ujian organisasi komputer.
Mengapa sebagian kalkulator memberi jawaban salah untuk nilai 64 bit?
Operator bitwise di JavaScript mengubah operandnya menjadi bilangan bulat 32 bit lebih dulu, sehingga halaman yang memakai ~x + 1 diam-diam kehilangan separuh atas nilai 64 bit dan melaporkan hasil yang masuk akal tetapi salah. Alat ini memakai BigInt sepanjang jalan, dan itulah sebabnya baris 64 bit di sini sesuai dengan yang ditampilkan debugger Anda.
Apa itu nol negatif dan mengapa ia penting?
Pada sign-magnitude, 00000000 dan 10000000 sama-sama berarti nol; pada komplemen satu, pasangannya adalah 00000000 dan 11111111. Dua nilai yang seharusnya sama karenanya bisa dianggap tidak sama bit demi bit. Komplemen dua hanya punya satu nol, dan itu menghapus satu kelas kasus khusus perangkat keras sekaligus.
Apakah yang saya ketik dikirim ke server?
Tidak. Halaman ini mengirim mesin konversinya ke browser Anda dan menjalankannya di sana. Dump register dan nilai firmware sering berasal dari sistem yang tidak bebas Anda bagikan, jadi tidak ada yang perlu dipercaya di sini selain tab jaringan — tidak ada permintaan yang dibuat.