8 bitlik ikinin tümleyeninde −5 nedir?
11111011 11111011, yani 0xFB.
İşaretli bir tam sayı yazın; işaret-büyüklük, birin tümleyeni, ikinin tümleyeni ve ofset ikili kodlamalarını 4-64 bit arasında tek seferde alın. Bit deseni veya hex yapıştırıp beş okumayı yan yana görün. Tarayıcıda çalışır.
İşaretli bir tam sayı yazın. Dört gösterim de tek seferde hesaplanır — sisteminizin hangisini kullandığını önceden bilmeniz gerekmez.
| Kodlama | Bitler | Hex |
|---|---|---|
| İşaret-büyüklük | 1000 0101 | 85 |
| Birin tümleyeni | 1111 1010 | FA |
| İkinin tümleyeni | 1111 1011 | FB |
| Ofset ikili | 0111 1011 | 7B |
İşaret-büyüklük ve birin tümleyeni birer bit desenini negatif sıfıra harcar; bu yüzden ikinin tümleyeninden bir değer az tutarlar ve en negatif sayıya ulaşamazlar.
Bir bellek dökümünde ya da bir yazmaçta bir bayt buldunuz ve nasıl okunması gerektiğini bilmiyorsunuz. Yapıştırın ve her yorum altında ne anlama geldiğini tek seferde görün — hangisinin doğru olduğu onu üreten sisteme bağlıdır, bu yüzden hepsi gösterilir.
| Şöyle okunur | Değer |
|---|---|
| İşaretsiz | 251 |
| İşaret-büyüklük | -123 |
| Birin tümleyeni | -4 |
| İkinin tümleyeni | -5 |
| Ofset ikili | 123 |
Yukarıdaki aracın kullandığı motorla hesaplanır; bu yüzden bu değerler ondan sapamaz.
| Ondalık | İşaret-büyüklük | Birin tümleyeni | İkinin tümleyeni | Ofset ikili | Hex |
|---|---|---|---|---|---|
| 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 |
| Genişlik | İkinin tümleyeni / ofset ikili | İşaret-büyüklük / birin tümleyeni |
|---|---|---|
| 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 |
Go Tools mühendislik ekibi tarafından geliştirildi ve doğrulandı.
11111011 11111011, yani 0xFB.
-128 … 127 İkinin tümleyeninde −128 ile 127; işaret-büyüklük ve birin tümleyeninde −127 ile 127.
değer − 2^n En üst bit 0 ise işaretsiz okuyun; 1 ise işaretsiz okumadan 2^n çıkarın.
−1 veya 255 İşaretli bayt olarak −1, işaretsiz bayt olarak 255. Bitler tek başına buna karar vermez.
İkinin tümleyeni matematiksel değil donanımsal bir soruya cevap verir: negatif sayıları, zaten yapmış olduğunuz toplayıcı çalışmaya devam edecek şekilde nasıl saklarsınız? Hile, −x değerini 2^n − x deseniyle temsil etmektir. Toplama böylece 2^n modunda sarmalanır ve işaretler için hiçbir özel durum olmadan doğru cevaba iner; çıkarmanın ayrı bir devreye ihtiyaç duymamasının nedeni budur.
Bundan iki sonuç çıkar ve ikisi de gerçek hatalarda karşımıza çıkar. Birincisi, aralık asimetriktir: sekiz bit −128 ile 128 arasını değil, −128 ile 127 arasını kapsar; çünkü desenlerin paylaştırılması gerekir ve işleri denkleştirecek bir negatif sıfır yoktur. İkincisi, işaret söküp atabileceğiniz bir bayrak değildir — 11111011 deseninin en üst biti 1'dir ama değer −123 değil −5'tir; yani negatif bir sayıyı okumak tek bir bite bakmak değil, sözcüğün tamamını yorumlamak demektir.
İşaret-büyüklük ile birin tümleyeni, yarışı kaybeden iki tasarımdır. Yine de bilmeye değerler: IEEE 754 kayan nokta işaret-büyüklük düzenini korudu ve ikinin tümleyenini keyfi değil kaçınılmaz gösteren şey tam da bu karşılaştırmadır.
// -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.
İşaret-büyüklük, birin tümleyeni, ikinin tümleyeni ve ofset ikili birlikte hesaplanır. Ofset ikili, çoğu hesaplayıcının atladığı ve ADC veri sayfalarının kullanmayı sürdürdüğü kodlamadır.
Elinizdeki bitleri ya da hex değerini yapıştırın; işaretsiz dahil beş okumanın tamamını görün. Bir döküm, cihazın bildirdiği sayıyla çeliştiğinde ihtiyaç duyduğunuz yön budur.
Her değer BigInt ile işlenir; böylece 0xFFFFFFFFFFFFFF9C, 32 bitlik bir kırpmanın üreteceği şeye değil −100'e çözülür.
Genişlik 8'de −128'in işaret-büyüklük ve birin tümleyeni karşılığı yoktur. Tablo, o sayıyı ifade etmeyen bir desen yazdırmak yerine bunu açıkça belirtir.
0 girin; sıfırın işaret-büyüklük ve birin tümleyenindeki ikinci bit deseni gösterilir. İkinin tümleyeninin neden kazandığına dair en açık tek argüman budur.
8 bitlik karşılaştırma tablosu ve genişliğe göre aralıklar, sayfa derlenirken canlı alanları besleyen aynı motorla üretilir; bu yüzden onunla senkronizasyonları bozulamaz.
BigInt.asIntN, Python'ın int.from_bytes(..., signed=True) çağrısı ve C'nin sabit genişlikli türleri, yazmakta olduğunuz kod için yetkili cevabı verir. Kodda onları kullanın; elinizde bir değer varken ve açık bir yorumlayıcı yokken bu sayfayı kullanın.
Değeri, programın bildirdiği türle birlikte gösterir; bir bit deseninde eksik olan bilgi tam olarak budur. Baytlar bir hat üzerinden bildirilmiş bir tür olmadan geldiğinde ise yardımcı olamaz — bu sayfanın var olma nedeni de o durumdur.
Tabanlar arasında dönüştürür, ama yalnızca negatif olmayan değerler için — negatifler orada açıkça reddedilir, çünkü bir tabanın işaretin nasıl saklandığı konusunda bir görüşü yoktur. İşaretli gösterim bu sayfanın işidir; büyüklükler için taban dönüştürücüyü kullanın.
Kayan noktadaki karşılığı. İkinin tümleyeni yerine işaret-büyüklük düzenini korur ve üssü 2^(e−1)−1 kadar yanlar; dolayısıyla iki sayfa aynı bellek sözcüğü hakkında farklı sorulara cevap verir.
-5, genişlik 8
işaret-büyüklük 1000 0101 birin tümleyeni 1111 1010 ikinin tümleyeni 1111 1011 (0xFB) ofset ikili 0111 1011
Üç kodlama yalnızca işaret bitinde uyuşur, geri kalan her şeyde ayrışır. Bir C int8_t değişkeninin gerçekten tuttuğu şey yalnızca ikinin tümleyeni satırıdır.
0xFB, genişlik 8
işaretsiz 251 işaret-büyüklük -123 birin tümleyeni -4 ikinin tümleyeni -5 ofset ikili 123
-128, genişlik 8
işaret-büyüklük gösterim yok birin tümleyeni gösterim yok ikinin tümleyeni 1000 0000 (0x80) ofset ikili 0000 0000
İşaret-büyüklük ve birin tümleyeni birer bit desenini negatif sıfıra harcar; bu yüzden −127 ile 127 arasında kalırlar ve −128'e ulaşamazlar. Burada bir bayt yazdıran araçlar yanlıştır.
0xFFFFFFFFFFFFFF9C, genişlik 64
ikinin tümleyeni -100 işaretsiz 18446744073709551516
32 bitten geniş her şeyin BigInt ile yapılması gerekir. JavaScript'in |, << ve >>> operatörleri sessizce 32 bite kırpar; bazı çevrimiçi hesaplayıcıların burada hata vermek yerine yanlış cevap döndürmesinin nedeni budur.
4, 8, 16, 32 veya 64. Bu bir görüntüleme tercihi değildir — aynı bitler farklı genişliklerde farklı sayılar anlamına gelir, dolayısıyla yanlış seçim cevabı değiştirir.
Eksi işareti dahil olmak üzere bir tam sayı yazın. Dört kodlama da siz yazdıkça, her birinin onaltılık biçimiyle birlikte güncellenir.
Bir ikilik dizeyi veya 0x ile başlayan bir değeri ters arama alanına yapıştırın; o tam desenin her yorum altında ne anlama geldiğini, işaretsiz okuma dahil, görün.
Sayfa, insanları en çok yanıltan iki durumu işaretler: en negatif değerin işaret-büyüklük ve birin tümleyeni karşılığının bulunmaması ve sıfırın bu iki kodlamada ikinci bir bit desenine sahip olması.
Bitleri ters çevirmek birin tümleyenini verir. Orada durmak ikinin tümleyeninden bir birim sapar ve sonuç hâlâ makul bir negatif sayı gibi göründüğü için hatayı kaçırmak kolaydır.
5 = 00000101 ~5 = 11111010 <- ones' complement, not -5
5 = 00000101 ~5 = 11111010 ~5 + 1 = 11111011 <- -5 in two's complement
JavaScript, bit düzeyi operatörlerin işlenenlerini 32 bite kırpar. Üst yarı hiçbir hata üretmeden kaybolur; yani sonuç eksik değil, yanlıştır.
0xFFFFFFFFFFFFFFFB // 18446744073709552000 -- the literal is already rounded ~0xFFFFFFFFFFFFFFFB + 1 // 0 -- silently wrong, expected -5
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n
Sıfır dolgusuyla genişletmek sayıyı yalnızca pozitifken korur. Negatif bir değerde işaret bitinin yeni bitlere çoğaltılması gerekir.
int8 0xFB (-5) int16 0x00FB (251) <- zero-extended
int8 0xFB (-5) int16 0xFFFB (-5) <- sign-extended
Sekiz bitte −128'in ne işaret-büyüklük ne de birin tümleyeni gösterimi vardır, çünkü iki kodlama da bir deseni negatif sıfıra harcar. Onun için 10000000 yazdırmak, ikinin tümleyeninin cevabını o sayıyı ifade edemeyen bir kodlamayla karıştırmaktır.
-128 sign-magnitude: 10000000 <- that pattern means -0
-128 sign-magnitude: no representation at width 8 -128 two's complement: 10000000
0xFF9C döndürüyor. İşaretsiz okumada bu 65436'dır ve bir sıcaklık değildir. Genişlik 16'da ikinin tümleyeni satırı −100 gösterir; 0.1 °C ölçek çarpanıyla sensörün söylediği −10.0 °C'dir.n−1 bit ise düz bir işaretsiz sayı olarak okunan büyüklüktür. Aralık −(2^(n−1)−1) ile 2^(n−1)−1 arasıdır, simetriktir ve iki sıfırı vardır. IEEE 754'ün kayan nokta için kullandığı düzen budur.2^n − 1 − x. Aralığı ve iki sıfırı işaret-büyüklükle aynıdır. Toplaması dolanan elde (end-around carry) gerektirir; ikinin tümleyeninin ortadan kaldırdığı karmaşa tam olarak budur. İngilizce adlardaki kesme işaretinin yeri de yazım hatası değildir: ones' complement baştan sona bir olan bir sözcüğe, two's complement ise tek bir ikinin kuvvetine görelidir.−x değeri 2^n − x olarak saklanır. Aralık −2^(n−1) ile 2^(n−1)−1 arasıdır, bilerek asimetriktir ve tek sıfırı vardır. Toplama, çıkarma ve çarpmanın alt sözcüğü işaretten bağımsızdır; kazanmasının bütün nedeni budur.value + 2^(n−1) değerini saklar; böylece −2^(n−1) baştan sona sıfır olur ve desenler kodladıkları değerlerle aynı sırada dizilir. İkinin tümleyeni deseninin en üst biti çevrilmiş hâline eşittir. Adlandırmaya dikkat: IEEE 754 üs alanları 2^(e−1)−1 kadar yanlıdır, yani burada kullanılan ofsetten bir eksik.&, |, ~ ve kaydırma operatörlerinin işlenenlerini işlemden önce 32 bitlik tam sayıya, sonra da geri çevirir; böylece 64 bitlik bir değer hiçbir hata üretilmeden üst yarısını kaybeder. Bu sayfadaki her dönüşüm bunun yerine keyfi duyarlıklı tam sayılar üzerinde yapılır; 64 bitlik uç değerlerin tam çıkmasının nedeni de budur.−(−128) yine −128'dir. Mutlak değer hesaplayan her kodun bu girdi için bir planı olmalı, her test kümesi de onu içermelidir.0xFB değerini 16 bitlik bir alana 0x00FB olarak kopyalamak −5'i 251'e çevirir. İşaretli bir değeri genişletmek, işaret bitini çoğaltmak demektir; sonuç 0xFFFB olur.BigInt.asIntN, Python'da int.from_bytes(..., signed=True) ve C'de sabit genişlikli türler ne demek istediklerini söyler ve uç durumları ele alır. Genişlik hataları elle yazılmış ~x + 1 ifadelerinden gelir.2^n − x sayısının bit deseni olarak saklandığı uzlaşımdır; çıkarma ile toplamayı aynı devreye indirir ve sayı doğrusunda tam olarak tek bir sıfır bırakır. 00000101 → 11111010 → 11111011. Yalnızca çevirme adımı size birin tümleyenini verir; ikisinin her zaman bir birim farklı olmasının nedeni budur. n bitle −2^(n−1) ile 2^(n−1)−1 arasını kapsar, çünkü işaret-büyüklük ile birin tümleyeninin yaptığı gibi bir deseni negatif sıfıra harcamaz. Artan o tek yuva negatif tarafa düşer. int8_t mı yoksa uint8_t mı kullandığınıza uyan satırı seçin. value + 2^(n−1) değerini saklar; böylece en küçük değer baştan sona sıfır olur ve ham desenleri işaretsiz tam sayı gibi sıralamak işaretli değerleri de sıralar. ADC ve DAC çıkışlarında ve ses örnekleme biçimlerinde karşınıza çıkar. IEEE 754 üs alanlarının farklı bir yanlılık kullandığına dikkat edin — 2^(e−1) değil 2^(e−1)−1 — dolayısıyla sayıyı olduğu gibi taşımayın. 65436 yazdırırken cihazın kastettiği ikinin tümleyeni değeri −100'dür. 65436 sayısını 0xFF9C hex biçiminde 16 bit genişlikte buraya yapıştırın; ikinin tümleyeni satırı amaçlanan okumayı gösterir. ~x + 1 kullanan bir sayfa 64 bitlik bir değerin üst yarısını sessizce kaybeder ve makul görünen ama yanlış bir sonuç bildirir. Bu araç baştan sona BigInt kullanır; buradaki 64 bit satırlarının hata ayıklayıcınızın gösterdiğiyle uyuşmasının nedeni budur. 00000000 ve 10000000 desenlerinin ikisi de sıfır anlamına gelir; birin tümleyeninde bunlar 00000000 ve 11111111'dir. Dolayısıyla eşit olması gereken iki karşılaştırma bit bit bakıldığında eşitsiz çıkabilir. İkinin tümleyeninin tek bir sıfırı vardır ve bu, koca bir donanım özel durumu sınıfını ortadan kaldırmıştır. Dönüştürme Araçları
Binary, hex, decimal, octal ve herhangi bir taban (2-36) arasında anında dönüştürün. Ücretsiz ve gizli — tüm işlem tarayıcınızda yapılır.
Dönüştürme Araçları
Linux dosya izinlerini sekizlik (755, 644) ve rwx simgeleri arasında çevrimiçi dönüştürün. Hazır chmod komutları alın, 777 gibi riskli ayarları anında yakalayın — ücretsiz, tamamen tarayıcınızda çalışır.
Dönüştürme Araçları
HEX'i RGB, HSL, OKLCH, OKLAB ve CMYK biçimlerine tarayıcınızda dönüştürün — herhangi bir biçimi tek tıkla kopyalayın. Ücretsiz, kayıt yok, renkleriniz sayfadan asla çıkmaz.
Dönüştürme Araçları
HEX renklerini tarayıcınızda CMYK'ye dönüştürün. Baskı önizlemeleri için sRGB tabanlı saf yaklaşım. Ücretsiz, kayıt yok, renkleriniz sayfadan asla çıkmaz.
Dönüştürme Araçları
Herhangi bir HEX rengi tarayıcınızda HSL'ye dönüştürün — 3 haneli, 6 haneli ve alpha içeren 8 haneli HEX desteklenir. Ücretsiz, anında, kayıt yok, renkleriniz sayfadan asla çıkmaz.
Dönüştürme Araçları
Tailwind v4 tasarım token'ları için HEX'i OKLCH'ye dönüştürün. Display P3 renk gamı uyarılarıyla canlı algısal olarak tekdüze çıktı. Ücretsiz, yalnızca tarayıcıda.