Záporná čísla

V tuhle chvíli bys už měl mít docela dobrou představu o tom, jak se v počítačích pracuje s čísly. Už víš, že počítače jsou signální přístroje, že každý signál si lze představit jako číslo ve dvojkové soustavě které lze převést do desítkové soustavy.

Takže když řeknu, že číslo 42 je ve dvojkové soustavě 101010 tak už víš, o čem mluvím.

Jak ale v počítači vypadá číslo 42?

Jak na negativní čísla?

Řekněme, že máme 1 bajt. Už víš, že 1 bajt = 8 bitů a z předchocích kapitol už víš, že 8 bitů je číslo v rozsahu 28 nebo od 0 do 255

0 = 00000000
1 = 00000001
2 = 00000010
3 = 00000011

42 = 00101010

255 = 11111111

Ale co když potřebuješ negativní čísla?

Musíš vymyslet jiný „kód“ jakým způsobem se převádí bity (signály v počítači) do celého čísla, které umí být jak kladné tak i záporné!

Znaménkový bit

Jedna možnost je vzít jeden bit zkraje a říct, že reprezentuje plusovou nebo mínusovou hodnotu. Například:

42 = 1|0101010
1 = znaménko +
0101010 = hodnota 42

No a záporné číslo -42 by vypadalo takto.

-42 = 0|0101010
0 = znaménko –
0101010 = hodnota 42

Tohle vypadá jako celkem jednoduchý, přímočarý řešení, že jo?

Tenhle způsob má problém: obsahuje reprezentaci kladné a záporné nuly.

0 = 1|0000000 …. +0?
0 = 0|0000000 …. -0?

Co se má stát, když sečteš plusovou nulu a negativní nulu? Co když je vynásobíš? Co když vynásobíš kladné číslo zápornou nebo kladnou nulou? Tento způsob se nepoužívá* právě kvůli tomu, že nutí ajťáky vymýšlet řešení pro problém, který nemá žádný reálný základ. Nula je jenom jedna a nemá znaménko, kladná a záporná nula nedává smysl.

*(v kapitole o desetinných číslech zjistíš, že to není zas tak úplně pravda)

Dvojkový doplněk

Negativní a záporná nula se nikomu nelíbila a tak se místo toho ujal mechanismus ukládání čísel, kterému se říká dvojkový doplněk. V tomto „kódu“ existuje jen jedna nula.

Pokud máš 8 bitový rozsah, tak začátek vypadá úplně stejně, jako kdybys počítal mezi dvěma číselnými soustavami.

0 = 00000000
1 = 00000001
2 = 00000010
3 = 00000011

42 = 00101010

Ale: jakmile vyplníš všechny bity kromě prvního na 1, uděláš následující.

  • Přičteš k číslu +1
  • Změníš znaménko na mínus
  • Začneš počítat pozpátku

126 = 01111110
127 = 01111111
-128 = 10000000
-127 = 10000001
-126 = 10000010
-125 = 10000011

-1 = 11111111

Souhrn

  • Procesor pracuje s čísly v určitém rozsahu.
  • Pro negativní čísla se může používat znaménkový bit, s ním ale vzniká nesmyslný koncept záporné a kladné nuly, který nemá žádný reálný základ, proto se nepoužívá.
  • Pro reprezentaci negativního čísla se používá dvojkový doplněk.