ein Kapitel zurück                                           ein Kapitel weiter

Zuerst wollen wir zu den verschiedenen Arten von Zahlennotationen durchnehmen. Dem wohl jedem Kind bekannte Zahlennotation ist das Dezimalsystem das wir im Alltag auch verwenden. Kaum einer macht sich Gedanken darüber wieso sich das Dezimalsystem aus den Zahlen 1-10 zusammensetzt. Nehmen wir als einfaches Beispiel die Zahl 1234. Wie setzt sich diese Zahl zusammen....

1x1000 + 2x100 + 3x10 + 4x1  

1000 entsprechen 103, 100 ist 102, 10 ist 101 und die letzte Zahl entspricht 100.
Also kann man die Zahl 1234 auch schreiben.....

1x103 + 2x102 + 3x101 + 4x100  

Und daher sagt man unser Rechensystem basiert auf der Zahl 10 (base10)
Damit haben wir wohl nicht viel neues Erfahren. Dann wollen wir als durchnehmen das....

Binärsystem

Das Binärsystem ist das Rechensystem mit dem unser Computer arbeitet und denkt. Der Computer kennt nicht die Zahl 5 oder den Buchstaben 'A'. Er generiert diese Zeichen aus dem Binärsystem. Das Binärsystem hat wie der Name (Bi = Zwei) schon sagt die Basis 2 (base2) und kann somit nur 2 Zahlen darstellen (0,1).
Setzten wir das ganze wieder auf die Zahl 55 um und sie können sehen das sich das ganze als einfacher herausstellt als man glaubt....

1x25 + 1x24 + 0x23 + 1x22 + 1x21 + 1x20     

Der Wert 5 dieser Zahl ist 1 Byte groß und 1 Byte entspricht wiederum 8 Bits.

Sehen wir uns das ganze nun mal bildlich an mit unserer Zahl 55...

Bitnummer: 7 6 5 4 3 2 1 0
55 = 0 0 1 1 0 1 1 1
Bit-Wert: 128 64 32 16 8 4 2 1


An diesem Beispiel dürfte Ihnen das Ganze in einem helleren Licht erscheinen. Sie sehen hier das die Bitnummer 5 auf 1 steht und den Wert 32 representiert....

1x25 (2*2*2*2*2) = 32  

und so kommen wir auf die Bitdarstellung der Zahl 55....

32+16+4+2+1 = 55  

...einfach alle Bit-Werte zusammenzählen die auf 1 stehen.
In unserem Fall wäre der Datentyp char da 1 Byte den Typ char darstellt. Bei dem Datentypen 'int' hätten wir schon 16 Bitnummern (0-15) = 2 Byte und bei 'long' wären es schon 32 Bitnummern (0-31) also 4 Bytes u.s.w.

Aber Achtung den Wert das größte Bitnummer eines Datentyps zum Beispiel bei 'char' Bit 7 = 128 läßt sich nur dann darstellen, wenn sie das Schlüsselwort unsigned vor char setzten....

Bitnummer: 7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0
Bit-Wert: 128 64 32 16 8 4 2 1


Wenn Bit 7 auf 1 steht wie auf dem Bild zu sehen ist und sie den den Datentyp 'char' nicht als 'unsigned' deklariert haben würde dies den Wert -1 darstellen. Das gleiche gilt auch für den anderen Datentypen und Ihre höchste Bitnummer.

Octalzahlen

Das Octalzahlensystem basiert auf die Basis 8 (base8)
Wollen wir uns mal ansehen wie die Zahl 142 in der oktalen Form aussieht......

1x82 + 4x81 + 2x80 = 216  

Wozu nun diese umständliche Darstellung von Zahlen? Nun eine Oktale Zahl repräsentiert immer 3 einzelne Bits.....

Octale Zahl Binärer Wert
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111


Eine oktale Zahl beginnt immer mit einer 0 bei unserer Zahl wäre das 0216 damit der Computer weiß das es sich hier um eine Oktalzahl und nicht um ein Dezimalzahl handelt. Jetzt wollen wir unsere Oktalzahl 0216 in die Binäre Darstellung anhand unserer Tabelle umstellen....

2 = 101; 1 = 001; 6 = 110;  entspricht 101 001 110  

Hexdezimal

Hexdezimal (oder 'Hex') bauen auf die Basis 16 auf (base16).
Das Hexdezimale Zahlensystem ist das am weitesten verbreitet Zahlensystem auf PC´s. Speziell wenn es um Hardware-oder Systemprogrammierung geht. Die Zahlen von 10-15 werden in Hexdezimaler Form durch A-F dargestellt. Anschließend wird bei 10 weitergezählt (siehe ASCII - Tabelle). Außerdem wird der Hexdezimalen Ziffer in C ein 0x vorangestellt (Beispiel : 0xa oder 0xA stellt den Dezimalen Wert 10 da). Hexzahlen stellen im Gegensatz zu Oktalzahlen 4 Bits pro Zeichen da....

Dezimal Hexdezimal Binär
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111


Wenn sie jetzt zum Beispiel den Hexwert 0xAB32 in einen Dezimalwert umwandeln wollen machen wir das folgendermaßen...

10x163 + 11x162 + 3x161 + 2x160 = 43826  

Wichtiger und vor allem deswegen benutzten wir die Hexzahlen ist es die Hexzahlen in Binäre Darstellung und umgekehrt zu verwenden...

0xAB32; A=1010; B=1011; 3=0011; 2=0010;   entspricht binär:   1011 1011 0011 0010  

Das dürfte nun als kleiner Überblick reichen welche Zahlensysteme es gibt. Hierzu nun ein kleines Beispiel wie wir z.B. mit Hexzahlen arbeiten können...

/*Download:hex.c*/
#include <stdio.h> typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; void bit(DWORD hex) { int x; if(hex) { x=(hex%2)?1:0; bit(hex/2); printf("%d",x); } } int main() { BYTE test=0xFF; WORD full=0xFFFF; DWORD temp=0xFFFFFFFF; printf("%8x =(dezimal)%8d = Binär: ",test,test); bit(test); printf("\n"); printf("%8x =(dezimal)%8d = Binär: ",full,full); bit(full); printf("\n"); printf("%8x =(dezimal)%8d = Binär: ",temp,temp); bit(temp); printf("\n"); return 0; }

Ich habe die Funktion...

void bit(DWORD hex)  

...mit absticht rekursiv programmiert und hinter dem rekursive Aufruf die printf()-Ausgabe ausgeführt da dies dazu führt das Zahlendarstellung andersherum ausgegeben wird, da ja bei jeden erneuten Funktionsaufruf der vorherige Teil auf dem Stack landet. Und beim Stack wird das als letzte draufgelegte als erstes wieder Ausgegeben.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf