Inhaltsverzeichnis Codierung: Zahlen (Nachträge)

Werbung
BIT I, WS 2016/17
Inhaltsverzeichnis
Codierung: Zahlen (Nachträge)
Umwandlungen Zwischen Hexadezimal-/Oktal- und Binärsystem
Speichergröÿen typischer Variablentypen . . . . . . . . . . . . . .
C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Notationen von Zahlen in Programmcode . . . . . . . . . . . . .
Bit- und Byteordnung, Endianness . . . . . . . . . . . . . . . . .
Gröÿenangaben für Speicherbereiche . . . . . . . . . . . . . . . .
Groÿ- und Kleinschreibung . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
2
3
3
3
4
5
Codierung: Zahlen (Nachträge)
Einige Punkte, die wir bisher im Zusammenhang mit der Codierung vernachlässigt haben, werden hier einmal kurz und relativ unzusammenhängend erläutert.
Umwandlungen Zwischen Hexadezimal-/Oktal- und Binärsystem
Das hexadezimale und das oktale Stellenwertsystem basieren auf Potenzen der Zahl zwei.
Daher sind Umwandlungen vom und ins binäre System sehr leicht möglich.
Beispiel Binär → Hex
Liegt etwa eine groÿe 4-Byte Zahl vor, z.B. die Binärdarstellung der Dezimalzahl 123456789,
also
00000111 01011011 11001101 00010101
dann reicht es aus, wenn wir diese Zahl in 4-Bit-Blöcke aufteilen und einzeln ins Hexadezimalsystem übertragen.
0000 0111 0101 1011 1100 1101 0001 0101
0
7
5
B
C
D
1
5
Es gilt also
12345678910 = 1110101101111001101000101012 = 75BCD1516
Das funktioniert, weil 4 Bit immer exakt die gleiche Informationsmenge codieren wie
eine einzelne Hexadezimalzahl. Eine einzelne Hexadezimalzahl mit n Stellen codiert 16n
verschiedene Zahlen. Es gilt aber:
24n = 16n , da: 24n = (24 )n
Entsprechend codieren also 2 Hexzahlen genauso viele verschiedene Zahlen wie 8 Bit, 3
Hexzahlen soviele wie 12 Bit, 4 soviele wie 16 Bit, etc. Einzelne Bytes drückt man daher
gerne als Folgen von je 2 Hexadezimalzahlen aus. Die resultierende Bitfolge ist dann bei
Bedarf relativ leicht rekonstruierbar.
8F = 1000 1111
9F = 1001 1111
AF = 1010 1111
...
1
BIT I, WS 2016/17
Codierung: Zahlen (Nachträge)
Beispiel Binär → Oktal
Für das Oktalsystem nehmen wir entsprechend nicht 4, sondern drei Bits, da auch hier
die abbildbaren Informationen immer gleich sind:
23n = (23 )n = 8n
Wir können also zur Konvertierung wie folgt vorgehen:
111 010 110 111 100 110 100 010 101
7
2 6
7
4 6
4
2 5
Es gilt also:
12345678910 = 1110101101111001101000101012 = 7267464258
Speichergröÿen typischer Variablentypen
Die genaue Gröÿe verschiedener Datentypen im Speicher hängt oft von der Plattform ab,
für die programmiert wird, sowie vom verwendeten Compiler. Einige Aussagen lassen
sich aber treen.
C/C++
Einige C-Standards machen Aussagen über die minimale Gröÿe von Integer-Typen.
So ndet sich etwa im C99 N1256 standard draft (Zier 5.2.4.2.1) Mindestangaben für
Zahlbereiche zu einigen Datentypen, die den folgenden Byte-Gröÿen entsprechen würden.
Ein Compiler, der mit dem Standard C 99 konform gehen möchte, müsste also diese Gröÿen mindestens realisieren, könnte sich aber auch entscheiden, gröÿere Bereiche
festzulegen.
Typ
char
short
unsigned short
int
unsigned int
long
unsigned long
long long
unsigned long long
float
double
long double
Minimalgröÿe (Byte)
1
2
2
2
2
4
4
8
8
(?)
(?)
(?)
Dabei signalisiert unsigned einen vorzeichenlosen Datentyp, also einen, der nur positive
Werte annehmen kann.
2
BIT I, WS 2016/17
Codierung: Zahlen (Nachträge)
Java
Java garantiert feste Speichergröÿen für bestimmte Datentypen. (Warum die Sprache
das kann, erfahren wir später im Kurs.)
Im folgenden die Datentypen, die primär für Zahlen bestimmt sind:
Typ
byte
short
int
long
float
double
Gröÿe (Byte)
1
2
4
8
4
8
Man beachte, dass hier keine unsigned Datentypen existieren.
Notationen von Zahlen in Programmcode
In vielen Programmiersprachen lassen sich Oktal- und Hexadezimalzahlen direkt eingeben. Dabei wird Oktalzahlen eine 0 vorangestellt und Hexadezimalzahlen ein 0x. Binärzahlen können über das Voranstellen von 0b eingegeben werden. Das folgende Beispiel
wäre gültig in C/C++/Java:
int
int
int
int
dec
oct
hex
bin
=
100;
= 0100;
= 0x100;
= 0b100;
Das hat denselben Eekt wie:
int
int
int
int
dec
oct
hex
bin
=
=
=
=
100;
64;
256;
4;
Besonders die Schreibweise für Hexadezimalzahlen wird gern auch auÿerhalb von Programmiersprachen verwendet (z.B. in diesem Skript).
Bit- und Byteordnung, Endianness
Die (allerallerallermeisten) Computer und Menschen sind sich darüber einig, wie sie mit
einzelnen Bits in einem Byte umgehen:
• Acht Bit machen ein Byte
• Einzelne Bits in einem Byte werden von links nach rechts gelesen
• Die höchstwertigste Stelle in einem Byte, das most-signicant bit, steht links
Beispiel: Die höchstwertige Stelle in 10001001 ist die linke 1, sie steht für 1 · 27 ,
die rechte 1 steht lediglich für 1 · 20
3
BIT I, WS 2016/17
Codierung: Zahlen (Nachträge)
• Will man Bits nummerieren, so geht man immer von rechts nach links vor und
beginnt mit 0.
Beispiel: Besteht das Byte 10001001 aus den Positionen c7 , ..., c0 , so bezeichnet c0
die rechte 1 und c3 die mittlere 1
Uneinigkeit besteht dagegen in verschiedenen Architekturen über die Reihenfolge der
Bytes. Hier gibt es zwei Optionen.
• Big-Endian-Systeme lesen wie wir Menschen zuerst das Big End einer Mehr-Byte-
Zahl, also die höchstwertige Stelle
Beispiel 1: Für die Zahl 0xFFCC33 sind vier Byte reserviert (z.B. ein int). Sie
werden gespeichert in der Reihenfolge
00 FF CC 33
Beispiel 2: Für die Zahl 0x7F00 sind zwei Byte reserviert (z.B. ein short). Sie wird
gespeichert in den Bytes
7F 00
• Little-Endian-Systeme speichern dasjenige Byte zuerst, das insgesamt den gerings-
ten Stellenwert hat. Die Reihenfolge der einzelnen Bits bleibt unberührt.
Beispiel 3: Für die Zahl 0xFACC33 sind vier Byte reserviert. Sie werden gespeichert
in der Reihenfolge:
33 CC FA 00
Beispiel 4: Für die Zahl 0x7F00 sind zwei Byte reserviert. Sie werden gespeichert
in der Reihenfolge
00 7F
Gröÿenangaben für Speicherbereiche
Nach dem Standard des International System of Units (SI) werden die metrischen Präxe kilo-, mega- etc. für Vielfache von 1000 verwendet.
Die Präxe werden aber auch für Vielfache von 1024 Verwendung, die oft in einem
vergleichbaren Bereich liegen, aber natürlich verschieden sind. Popularisiert wurde diese Verwendung unter anderem durch die Verwendung als Standard im Betriebssystem
Windows.
Seit 1998 wird versucht, die Verwendung zu standardisieren, indem für Vielfache von
1024 andere Bezeichnungen eingeführt werde, die die Silbe -bi-(für binär ) im Namen
tragen.
Wert
1
1000 (Tausend)
10002 (Million)
10003 (Milliarde)
10004 (Billion)
10005 (Billiarde)
10006 (Trillion)
10007 (Trilliarde)
Abk.
1B
1 kB
1 MB
1 GB
1 TB
1 PB
1 EB
1 ZB
Name
byte
kilobyte
megabyte
gigabyte
terabyte
petabyte
exabyte
zettabyte
Wert
Abk.
Name
210
220
230
240
250
260
270
1 KiB
1 MiB
1 GiB
1 TiB
1 PiB
1 EiB
1 ZiB
kibibyte
mebibyte
gibibyte
tebibyte
pebibyte
exbibyte
zebibyte
= 1024
= 10242
= 10243
= 10244
= 10245
= 10246
= 10247
4
BIT I, WS 2016/17
Codierung: Zahlen (Nachträge)
Wert
10008 (Quadrillion)
Abk.
1 YB
Name
yottabyte
Wert
280 = 10248
Abk.
1 YiB
Name
yobibyte
Man beachte die Kleinschreibung von k als einzigem Kürzel bei den metrischen Abkürzungen.
Entsprechendes gilt für Bit statt Byte:
Wert
1
1000 (Tausend)
10002 (Million)
10003 (Milliarde)
10004 (Billion)
10005 (Billiarde)
10006 (Trillion)
10007 (Trilliarde)
10008 (Quadrillion)
Abk.
1 bit
1 kbit
1 Mbit
1 Gbit
1 Tbit
1 Pbit
1 Ebit
1 Zbit
1 Ybit
Name
bit
kilobit
megabit
gigabit
terabit
petabit
exabit
zettabit
yottabit
Wert
Abk.
Name
210
220
230
240
250
260
270
280
1 Kibit
1 Mibit
1 Gibit
1 Tibit
1 Pibit
1 Eibit
1 Zibit
1 Yibit
kibibit
mebibit
gibibit
tebibit
pebibit
exbibit
zebibit
yobibit
= 1024
= 10242
= 10243
= 10244
= 10245
= 10246
= 10247
= 10248
Zum leichteren Verständnis der Umrechnungen seien hier noch beispielhaft ein paar
Äquivalenzen angegeben:
1
1
1
1
Mbit
Mibit
MB
MiB
=
=
=
=
1
1
1
1
1000
1024
1000
1024
kbit
Kibit
kB
KiB
kbit
Kibit
kB
KiB
=
=
=
=
=
=
=
=
1
125
128
1000
1024
125000
131072
1000000
1048576
B
B
B
B
B
B
B
B
B
=
=
=
=
=
=
=
=
=
8
1000
1024
8000
8192
1000000
1048576
8000000
8388608
bit
bit
bit
bit
bit
bit
bit
bit
bit
Groÿ- und Kleinschreibung
• Speziell für die Gröÿe von einem Kilobyte existiert die Konvention KB statt kB
zu schreiben, wenn von 1024 statt 1000 Byte die Rede ist. Diese Konvention lässt
sich aber nicht auf die anderen Gröÿenordnungen übertragen. (Man ndet also
nicht mB stat MB, etc.)
• Die Einheit Kbit (statt kbit ) wird verwendet (und zwar in beiden Verwendungen,
also für 1000 sowie für 1024 bit)
• Für die Abkürzungen der Gröÿenordnungen von Bits existeiert auÿerdem die Konvention, die gleichen Abkürzungen zu verwenden wie für die Gröÿenordnungen der
Bytes, aber ein kleines b statt dem groÿen B zu verwenden. Demnach wären
8 kb = 1 kB
8 kB = 64 kb
1 Mb = 125 kB = 1000 kb
Die besser lesbare (und standardisierte) Schreibweise wäre:
8 kbit = 1kB
8 kB = 64 kbit
1 Mbit = 125 kB = 1000 kbit
5
Herunterladen