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