SEN2201 · 2. hafta · Bits, Data Types, and Operations

Bitler ve tam sayılar: 2's complement, overflow, sign extension

Bir bit desenini unsigned, sign-magnitude, 1's ve 2's complement olarak okumak, ikilik/onaltılık çevirmeler, 2's complement toplama-çıkarma ve overflow kuralı. Vizenin en çok puan taşıyan kısmı.

bitunsigned integersign-magnitude1's complement2's complementoverflowcarry-outsign extensionhexadecimalMSBLSB

Bu ders sayılarla başlar, çünkü bilgisayar sadece bit görür: 0 ya da 1. Bir tam sayının, bir harfin, bir komutun hepsi aynı 0-1 dizisidir. Anlamı, o diziyi nasıl okuduğuna bağlıdır. Vizede bu sayfadan kesin soru gelir: bir deseni dört şekilde oku, bir sayıyı 2’s complement’e çevir, iki sayıyı topla ve overflow olup olmadığını kuralla gerekçelendir.

Altın kurallar:

  1. Desen anlam taşımaz, gösterim taşır. 1100 0110 unsigned 198’dir, 2’s complement -58’dir.
  2. 2’s complement’te MSB’nin ağırlığı negatiftir: 8 bitte -128.
  3. -X = ters çevir + 1.
  4. Overflow sadece aynı işaretli iki sayı toplanınca ve sonuç ters işaretli çıkınca olur.
  5. Sign extension: genişletirken MSB’yi kopyala, 0 ile doldurma.

Bit ve konumsal değer

kk bit ile 2k2^k farklı desen yazılır. 8 bit: 256 desen. Bir unsigned tam sayıda her bitin ağırlığı 2’nin bir kuvvetidir. En sağdaki bit LSB (b0, ağırlık 1), en soldaki MSB (8 bitte b7, ağırlık 128).

ağırlık:  128  64  32  16   8   4   2   1
bit:        1   0   0   1   1   1   0   1     = 128+16+8+4+1 = 157

Ondalık → ikilik

İki yöntem var. Bölme: 2’ye böl, kalanı yaz, bölüm 0 olana kadar devam et, kalanları aşağıdan yukarı oku. Kuvvet çıkarma (daha hızlı): sığan en büyük 2 kuvvetini çıkar, o sütuna 1 yaz.

214 → 214-128=86 → 86-64=22 → 22-16=6 → 6-4=2 → 2-2=0
1'ler: 128, 64, 16, 4, 2  →  1101 0110 = 0xD6

İkilik ↔ onaltılık (hexadecimal)

Bir hex hane tam olarak 4 bittir. İkilikten hex’e geçerken sağdan 4’erli grupla, sol grubu 0 ile tamamla.

hex0123456789ABCDEF
bin0000000100100011010001010110011110001001101010111100110111101111
10 1111 0111   →   0010 1111 0111   →   0x2F7
0x2F7 = 2·256 + 15·16 + 7 = 512 + 240 + 7 = 759

TUZAK · soldan gruplamak. 1011101 için soldan 1011|101 yazarsan B5 bulursun, yanlış. Sağdan: 101|1101 → 0101 1101 = 0x5D.

İşaretli sayılar: dört gösterim

Negatif sayıları yazmanın üç tarihsel yolu var. Hepsinde MSB = 0 ise sayı pozitiftir ve değer unsigned ile aynıdır. Farklar sadece MSB = 1 olduğunda ortaya çıkar.

GösterimMSB = 1 ise değer8 bit aralıkSıfır
Unsignednormal topla0 … 2551 tane
Sign-magnitudeeksi, kalan 7 bitin değeri-127 … +1272 tane (+0, -0)
1’s complementtüm bitleri çevir, eksi koy-127 … +1272 tane
2’s complementMSB’yi -128 say, gerisini topla-128 … +1271 tane

Genel kk bit için:

2’s complement: −2k−1  …  2k−1−1SM ve 1’s: −(2k−1−1)  …  2k−1−1\text{2's complement: } -2^{k-1} \;\ldots\; 2^{k-1}-1 \qquad \text{SM ve 1's: } -(2^{k-1}-1) \;\ldots\; 2^{k-1}-1

Örnek: 0x9C = 1001 1100.

OkumaHesapDeğer
Unsigned128+16+8+4156
Sign-magnitudeeksi, 0011100 = 28-28
1’s complementçevir: 0110 0011 = 99-99
2’s complement-128+16+8+4-100

Hızlı kontrol: 2’s complement değer = unsigned - 256. 156 - 256 = -100.

Neden herkes 2’s complement kullanıyor?

Çünkü toplama devresi işaretle hiç ilgilenmeden doğru sonuç verir. 5+(−5)5 + (-5): 0000 0101 + 1111 1011 = 1 0000 0000, 9. bit atılınca 0000 0000. Tek bir sıfır var ve toplayıcı unsigned ile aynı. LC-3 ve neredeyse bütün bilgisayarlar 2’s complement kullanır.

2’s complement: negatif alma

Tarif: pozitifini yaz, bütün bitleri ters çevir, 1 ekle.

+77   = 0100 1101
ters  = 1011 0010
+1    = 1011 0011   = -77 = 0xB3
kontrol: -128 + 32 + 16 + 2 + 1 = -77

Kısayol: sağdan başla, ilk 1’e kadar (o 1 dahil) aynen kopyala, solundaki her biti çevir. 0010 1000 (40) → 1101 1000 (-40).

Dikkat: en negatif sayının pozitifi yoktur. 8 bitte -128 = 1000 0000; ters çevir + 1 yine 1000 0000 verir.

Sign extension

Bir sayıyı daha geniş bir alana taşırken (örneğin 5 bitlik bir offset’i 16 bitlik register’a) MSB’yi sola kopyalarsın. Pozitifse 0, negatifse 1 eklenir. Değer değişmez.

5 bitDeğer8 bitDeğer
01101+130000 1101+13
10110-101111 0110-10
10000-161111 0000-16

16 bitlik hex’te negatif sayılar F ile başlar: -13 = 0xFFF3, -6 = 0xFFFA. LC-3’te ADD R1, R1, #-1 yazdığında 5 bitlik 11111 bu şekilde 16 bite genişletilir (7-8. hafta).

TUZAK · 0 ile doldurmak. 10110’yı 00010110 yaparsan 22 olur. Negatif bir sayı pozitife döndü. Sign extension’da kural tek: MSB’yi kopyala.

Toplama, çıkarma ve overflow

2’s complement toplama sıradan ikilik toplamadır: sağdan sola, carry’leri yukarı taşı. 1+1 = 0 elde 1, 1+1+1 = 1 elde 1. MSB’den taşan 9. bit atılır.

Çıkarma için ayrı devre yoktur: A−B=A+(−B)A - B = A + (-B).

Overflow kuralı

Sonuç kk bitin aralığına sığmıyorsa overflow olur. Bunu anlamanın yolu işaretlere bakmak:

  • (+) + (+) = (−) çıktıysa overflow.
  • (−) + (−) = (+) çıktıysa overflow.
  • (+) + (−) toplamında asla overflow olmaz.

Sınav cümlesi: “Overflow occurs only if both operands have the same sign and the result has the opposite sign.” Donanımdaki eşdeğer test: MSB’ye giren carry, MSB’den çıkan carry’den farklıysa overflow.

Çözümlü örnek 1: 01010101 + 00101010

   0101 0101    ( 85)
 + 0010 1010    ( 42)
 -----------
   0111 1111    (127)   iki pozitif, sonuç pozitif → overflow yok

Çözümlü örnek 2: A=10010110A = 10010110, B=00110010B = 00110010, A−BA - B = ?

A  = 1001 0110   = -106
B  = 0011 0010   =  +50   → -B: ters 1100 1101, +1 → 1100 1110 (-50)

    1001 0110   (-106)
  + 1100 1110   ( -50)
  -----------
  1 0110 0100   → 9. bit atılır → 0110 0100 = +100

Gerçek cevap −106−50=−156-106 - 50 = -156, 8 bite sığmaz. Toplanan iki sayı (A ve -B) negatif, sonuç pozitif: overflow. Bit 7’ye giren carry 0, çıkan 1.

TUZAK · carry-out ile overflow’u karıştırmak. 11110000 + 00100000 = 1 00010000. Dışarı 1 taştı ama sonuç 16, doğru (-16 + 32). Carry-out unsigned toplamada “sonuç büyük” demektir; 2’s complement’te overflow’un göstergesi değildir. Tersi de olur: 01101100 + 00110001’de carry-out yok, ama overflow var.

TUZAK · A − B’de yanlış sayıya bakmak. Overflow kuralını uygularken B’nin değil, -B’nin işaretine bak. Çünkü toplanan sayı o.

Kaç bit gerekir?

SoruYöntemÖrnek
Unsigned NN2k>N2^k > N olan en küçük kk300 → 29=5122^9 = 512 → 9 bit
2’s complement pozitif NN2k−1−1≥N2^{k-1} - 1 \ge N+100 → 27−1=1272^7 - 1 = 127 → 8 bit
2’s complement negatif −N-N−2k−1≤−N-2^{k-1} \le -N-300 → −512-512 → 10 bit

Sık yapılan hatalar

Yanlış düşünceDoğrusu
1000 0000 = -0 (2’s complement)-128. -0 sign-magnitude’da
-X = sadece bitleri çevirO 1’s complement; 2’s için +1 ekle
Carry-out varsa overflow varİşaret kuralına bak; carry-out atılır
(+) + (−) overflow olabilirAsla olmaz, sonuç ikisinin arasında
A − B’de B’nin işaretine bak-B’nin işaretine bak
Sign extension: sola 0 ekleMSB’yi kopyala
Hex için soldan gruplaSağdan 4’erli grupla
8 bit 2’s aralığı -127..127-128..127 (tek sıfır, bir negatif fazla)

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

What range of integers can be represented with 6 bits in 2's complement?

Cevabı göster
-32 to +31

kk bit 2's complement aralığı −2k−1-2^{k-1} ile 2k−1−12^{k-1}-1 arasıdır. k=6k = 6: −25=−32-2^5 = -32, 25−1=312^5 - 1 = 31.

Soru 2kolay

Convert 1101101011 (binary) to hexadecimal and to decimal (unsigned).

Cevabı göster
0x36B = 875

Sağdan 4'erli grupla: 11 | 0110 | 1011 → 0011 0110 1011 = 3, 6, B → 0x36B.
Ondalık: 3·256 + 6·16 + 11 = 768 + 96 + 11 = 875.

Soru 3orta

Give the decimal value of the 8-bit pattern 0xD3 as (a) unsigned, (b) sign-magnitude, (c) 1's complement, (d) 2's complement.

Cevabı göster
211, -83, -44, -45

0xD3 = 1101 0011. (a) 128+64+16+2+1 = 211.
(b) MSB = 1 → eksi; kalan 7 bit 1010011 = 83 → -83.
(c) Tüm bitleri çevir: 0010 1100 = 44 → -44.
(d) MSB'yi -128 say: -128+64+16+2+1 = -45. Kontrol: 211 - 256 = -45.

Soru 4kolay

Represent -58 in 8-bit 2's complement. Give the answer in binary and hex.

Cevabı göster
11000110 = 0xC6

+58 = 32+16+8+2 = 0011 1010. Ters çevir: 1100 0101. 1 ekle: 1100 0110.
Hex: 1100 = C, 0110 = 6 → 0xC6. Kontrol: -128+64+4+2 = -58.

Soru 5kolay

Sign-extend the 5-bit 2's complement value 10110 to 8 bits. What decimal value does it represent before and after?

Cevabı göster
11110110, -10 both

MSB 1, sola üç tane 1 kopyala: 11110110. Önce: -16+4+2 = -10. Sonra: -128+64+32+16+4+2 = -10. Değer değişmez. Sola 0 ekleseydin 00010110 = 22 olurdu, yanlış.

Soru 6orta

Write -200 as a 16-bit 2's complement hexadecimal number.

Cevabı göster
0xFF38

200 = 0000 0000 1100 1000 (0x00C8). Ters çevir: 1111 1111 0011 0111. 1 ekle: 1111 1111 0011 1000 = 0xFF38.
Kontrol: 0xFF38 = 65336, 65336 - 65536 = -200.

Soru 7orta

Compute 01101100 + 00110001 in 8-bit 2's complement. Give the result and say whether overflow occurred.

Cevabı göster
10011101, overflow

108 + 49 = 157, ama 8 bitte en büyük pozitif 127. Toplam 10011101 çıkar, MSB 1 (negatif, -99). İki pozitif toplandı, sonuç negatif: overflow. Bit 7'ye giren carry 1, çıkan 0, farklı.

Soru 8orta

Compute 11110000 + 00100000 in 8-bit 2's complement. There is a carry out of bit 7. Is this an overflow?

Cevabı göster
00010000 (+16), no overflow

-16 + 32 = 16. İşaretleri farklı iki sayının toplamında overflow asla olmaz. Bit 7'den çıkan carry atılır; 2's complement'te carry-out overflow göstergesi değildir. Sonuç 00010000 = 16, doğru.

Soru 9orta

In 8-bit 2's complement, A = 00101100 and B = 11101001. Compute A - B as A + (-B). Did overflow occur?

Cevabı göster
01000011 = 67, no overflow

B = -23, -B = +23 = 00010111 (B'yi ters çevir: 00010110, +1: 00010111).
A + (-B) = 00101100 + 00010111 = 01000011 = 67. Kontrol: 44 - (-23) = 67.
Toplanan iki sayı (A ve -B) pozitif, sonuç pozitif → overflow yok.

Soru 10zor

In 8-bit 2's complement, A = 01011010 and B = 10100110. Compute A - B and decide whether overflow occurred.

Cevabı göster
10110100, overflow

A = 90, B = -90. -B = 01011010 (+90).
A + (-B) = 01011010 + 01011010 = 10110100 (MSB 1, -76 okunur).
Gerçek sonuç 180 > 127. İki pozitif (A ve -B) toplandı, sonuç negatif: overflow. Tuzak: B negatif diye "farklı işaret, overflow olmaz" deme, işaretine bakacağın sayı -B.

Soru 11zor

Compute 10111010 + 11000011 in 8-bit 2's complement and decide whether overflow occurred.

Cevabı göster
01111101, overflow

-70 + (-61) = -131 < -128, sığmaz. Bit bit toplam 1 01111101, 9. bit atılır: 01111101 = +125. İki negatif toplandı, sonuç pozitif: overflow. Bit 7'ye giren carry 0, çıkan 1.

Soru 12zor

What is the minimum number of bits needed to represent (a) the unsigned value 300, (b) the value -300 in 2's complement?

Cevabı göster
9 and 10

(a) 28=256≤300<512=292^8 = 256 \le 300 < 512 = 2^9 → 9 bit. (b) kk bit 2's complement en küçük −2k−1-2^{k-1}. −28=−256>−300-2^8 = -256 > -300 yetmez, −29=−512≤−300-2^9 = -512 \le -300 → 10 bit.

Doğrulama: Tüm çevirmeler, dört okuma tabloları, toplama sonuçları, carry ve overflow kararları node ile bit bit hesaplandı (verify/SEN2201/02.mjs).

Deftere not kartı

k bit: unsigned 0..2^k-1 | SM ve 1's -(2^(k-1)-1)..2^(k-1)-1 (iki sıfır) | 2's -2^(k-1)..2^(k-1)-1 8 bit: 0..255 | ±127 | -128..127 2's oku: MSB = -128, gerisi + (ya da unsigned - 256) -X: ters çevir + 1 | kısayol: sağdan ilk 1'e kadar kopyala, solunu çevir SM: MSB işaret, gerisi büyüklük | 1's: hepsini çevir, eksi koy bin -> hex: SAĞDAN 4'lü grupla | hex -> bin: her hane 4 bit Sign extension: MSB'yi sola kopyala (10110 -> 11110110, değer aynı) OVERFLOW: aynı işaretli iki sayı + sonuç ters işaret (+)+(-) ASLA overflow olmaz. A-B'de -B'nin işaretine bak! Donanım: MSB'ye giren carry != çıkan carry 9. bit carry'yi at. carry-out != overflow 2^10=1024 2^16=65536 -1 = 0xFF / 0xFFFF