4. Technik: Zahlensysteme

Wir wollen uns in dieser Veranstaltung auf die Maschine zubewegen. Um zu verstehen, wie Computer wirklich mit Zahlen umgehen, muss man bedenken, dass sie nicht zehn, sondern nur einen Finger haben. Deshalb stellen sie Zahlen anders dar als wir.

“Normale” Zahlen, nämlich Dezimalzahlen, sind zur Basis 10 geschrieben:

245 = 2 ⋅ 102 + 4 ⋅ 101 + 5 ⋅ 100

– eine Zahl wird dargestellt als Summe von Beiträgen von Zehnerpotenzen.

Computer setzen Zahlen als Summen von Zweierpotenzen zusammen:

10+01101⋅0 2022+ =0 ⋅1 2 ⋅1 27+ +0 ⋅ 02 ⋅0 26= +1208 ⋅+ 2516++14⋅ 2=41+480. ⋅ 23

Binärzahlen sind also Folgen von Nullen und Einsen, ganz wie Dezimalzahlen Folgen von Dezimalziffern sind. In diesem Skript werden wir Binärzahlen immer mit einem Index 2 notieren.

Um Binärzahlen in Dezimalzahlen zu wandeln, fängt man also an, von rechts bei Null anfangend die Ziffern durchzuzählen und multipliziert die Ziffer jeweils mit der entsprechenden Zweierpotenz.

Vier binäre Ziffern können Zahlen zwischen 0 und 15 beschreiben, und zwei von diesen Vierergruppen sind ein Byte (nämlich 8 bit). Kompromiss zwischen Länge und Computergerechtigkeit: Hexadezimalziffern (besser: Sedezimalziffern). 0-9 werden erweitert um A-F (A=10⋅⋅⋅F=15), und dann ist

1         0
0x5F  = 5 ⋅ 16 + 15 ⋅ 16 = 95.

Dies ist offenbar ganz analog zum Vorgehen bei Binärzahlen; nur ist eben die Basis 16 und nicht Zwei, und entsprechend werden Sechzehnerpotenzen und nicht Zweierpotenzen verwendet.

Das Hin- und Herrechnen zwischen Zahlensystemen ist mühsam, einE guteR ProgrammiererIn sollte aber wenigstens für die 16 Hex-Ziffern die Bitmuster von 0 = 0000 bis F = 1111 sowie die ersten paar Zweierpotenzen (vielleicht bis 1024) im Kopf haben – es hilft sehr beim Analysieren von Problemen, die einem die Maschine so bereitet.

Es ist trivial, Konversionsfunktionen von Hex oder Binär nach Dezimal zu schreiben (in Python tuts auch "%d"%0xbaba). Für sedezimale Zahlen in Strings könnte folgender Python-Code verwendet werden:

def hexToInt(hexStr):
  res = 0
  for digit in hexStr:
    res *= 16
    if digit in string.digits:
      res += int(digit)
    elif digit in string.ascii_lowercase:
      res += ord(digit)-ord('a')+10
    elif digit in string.ascii_uppercase:
      res += ord(digit)-ord('A')+10
  return res

– kompliziert ist das eigentlich nur, weil wir Groß- und Kleinbuchstaben verarbeiten wollen (wie könnte das mit einem Dictionary implementiert werden?)

Die umgekehrte Prozedur ist auch nicht schwer, wenn man “von hinten” anfangen darf (Python macht es uns hier einfach):

def intToHex(number):
  res = []
  while number>0:
    curRem = number%16
    res.append(string.hexdigits[curRem])
    number /= 16
  res.reverse()
  return "".join(res)

Präfixe

Es ist:

210 = 1024 ≈  1000

    220 = 1 048576 ≈  106
 30                     9
2   = 1 073 741824 ≈  10

Wegen dieser bequemen Nähe haben Leute angefangen, 210 Bytes als “Kilobytes” zu bezeichnen und analog für Mega und Giga. Das Problem ist, dass Kilo exakt für 103 steht und, wenns drauf ankommt, Konfusion herrscht. In diesem Skript halten wir uns an die IEC-Konvention, nach der binäre Vielfache mit einem i gekennzeichnet sind. Es sind also 1kB = 103 Bytes, aber 1kiB = 210 Bytes und so fort für MB, MiB, GB und GiB.

Gesprochen werden soll kiB übrigens als “kibibyte”. Ich kenne aber niemanden, der/die das tut.

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Erweitert die Funktionen hexToDez und dezToHex so, dass sie für beliebige Basen kleiner als 36 funktionieren.

(2)

Die guten alten 312-Zoll-Disketten waren (sind) in High Density auf zwei Seiten zu je 80 Spuren mit je 18 Sektoren zu je 512 Bytes beschrieben. Wie viele Daten passen auf eine so formatierte Diskette? Drückt das in Bytes, kB, kiB, MB und MiB aus.

(3)

Wie groß ist der relative Unterschied zwischen 1kiB und 1kB? Zwischen 1MiB und 1MB? Zwischen 1GiB und 1 GB ? Wenn ihr wollt, probiert euch an der Asymptotik (d.h., wie entwickelt sich das Verhältnis von dezimalen und binären Präfixen für immer größere Zahlen?)


Markus Demleitner

Copyright Notice