Orijinal soruda hem açık soruyu (CHAR_BIT nedir) hem de örtük soruyu (bu nasıl çalışır) yanıtlamaya çalışıyorum.
C ve C ++ 'daki bir karakter, C programının adresleyebileceği en küçük bellek birimini temsil eder *
C ve C ++ 'daki CHAR_BIT, bir karakterdeki bit sayısını temsil eder. Karakter türündeki diğer gereksinimler nedeniyle her zaman en az 8 olmalıdır. Uygulamada, tüm modern genel amaçlı bilgisayarlarda tam olarak 8'dir, ancak bazı tarihi veya uzman sistemler daha yüksek değerlere sahip olabilir.
Java'nın CHAR_BIT veya sizeof eşdeğeri yoktur, Java'daki tüm ilkel türler sabit boyutta olduğundan ve nesnelerin iç yapısı programcıya opak olduğundan buna gerek yoktur. Bu kodu Java'ya çeviriyorsanız, "sizeof (int) * CHAR_BIT - 1" sabit değerini 31 ile değiştirebilirsiniz.
Bu özel kodda, bir int'teki bit sayısını hesaplamak için kullanılmaktadır. Bu hesaplamanın int türünün herhangi bir dolgu biti içermediğini varsaydığını unutmayın.
Derleyicinizin işaretli sayıların bit kaymalarını genişletmeyi seçtiğini ve sisteminizin negatif sayılar için 2s tamamlayıcı gösterimi kullandığını varsayarsak, bu "MASK" ın pozitif veya sıfır değer için 0 ve negatif bir değer için -1 olacağı anlamına gelir.
İkili tümleme sayısını olumsuzlamak için bit düzeyinde değil yapmalı ve sonra bir tane eklemeliyiz. Eşit bir şekilde bir tane çıkarabilir ve sonra onu bitler halinde olumsuzlayabiliriz.
Yine, iki tamamlayıcı temsilinin -1'in tümü tarafından temsil edildiğini varsayarsak, bu nedenle dışlayıcı veya -1 ile bitsel olumsuzlamaya eşittir.
Yani v sıfır olduğunda sayı yalnız bırakılır, v bir olduğunda olumsuzlanır.
Dikkat edilmesi gereken bir şey, C ve C ++ 'daki işaretli taşmanın tanımsız bir davranış olduğudur. Bu nedenle, bu ABS uygulamasını en negatif değerde kullanmak tanımsız davranışa yol açar. Bu, programın son satırının işaretsiz int olarak değerlendirileceği şekilde yayınlar eklenerek düzeltilebilir.
* Bu genellikle donanımın adresleyebileceği en küçük bellek birimiyle aynı değildir, ancak esasen aynı değildir. Bir uygulama, potansiyel olarak birden çok donanım adreslenebilir bellek birimini bir program adreslenebilir bellek biriminde birleştirebilir veya bir donanım adreslenebilir bellek birimini birden çok program eklenebilir bellek birimine bölebilir.