1. Darstellung von Daten im Rechner Hauptspeicherinhalt Programmcode Daten numerisch Ganze Zahlen logisch alphanumerisch Zeichen Gleitkommazahlen vorzeichenlos mit Vorzeichen einfache Genauigkeit Vektorgrafik Ton Grafik Zeichenketten Bitmapgrafik Digit. Video höhere Genauigkeit Abb. 1.1: Einteilung der Daten Kennzeichen eines Basis-N-Zahlensystems: • Zahlenbasis • Alphabet (Ziffernvorrat) Basis Alphabet Dualsystem 2 0, 1 Oktalsystem 8 0, 1, 2, 3, 4, 5, 6, 7 Dezimalsystem 10 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Hexadezimalsystem 16 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F Beispiel: Darstellung der Zahl 574 in verschiedenen Zahlensystemen Dezimal: Binär: Oktal: Hexadezimal: 2 1 0 574 = 5*10 + 7*10 + 4*10 9 5 4 3 2 1 10001111102 = 1*2 + 1*2 + 1*2 + 1*2 + 1*2 + 1*2 3 1 0 10768 = 1*8 + 7*8 + 6*8 2 1 0 23E16 = 2*16 + 3*16 + 14*16 Vergleich der vier wichtigsten Zahlensysteme: Binärsystem + Zahlen sind direktes Abbild des Speicherinhaltes - lange Zahlen schlecht aufzuschreiben (fehlerträchtig) Dezimalsystem + für den Menschen leicht verständlich - Umwandlung in‘s Binärsystem „mühsam“ Oktalsystem + leicht in‘s Binärsystem konvertierbar - Zifferngrenzen nicht auf Byte-Grenzen Hexadezimalsystem + leicht in‘s Binärsystem konvertierbar + kurze Zahlen + Ziffern auf Bytegrenzen - Anzeige für Buchstaben erforderlich © Klaus Rittmeier 2014 1. Darstellung von Daten im Rechner Die Werte lauten allgemein: S -1 -2 -23 (E7...E0) - 127 S -1 -2 -52 (E10...E0) - 1023 Short: Wert = (-1) * (1 + M1 * 2 + M2 * 2 + ... + M23 * 2 ) * 2 Long: Wert = (-1) * (1 + M1 * 2 + M2 * 2 + ... + M52 * 2 ) * 2 Temporary: Wert = (-1) * (M0 + M1 * 2 + M2 * 2 + ... + M63 * 2 ) * 2 S -1 -2 -63 (E14...E0) - 16383 Beispiel: 1 70,454 = 7,0454 * 10 lautet im Short-Real-Format: 428CE9FC = 0|100 0010 1|000 1100 1110 1001 1111 1100 -4 -5 -8 -9 -10 -12 -15 -16 -17 -18 -19 -20 -21 Mantisse: 2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 = 0,1008906 noch implizit 1 hinzuaddieren = 1,1008906 Exponent: 133 - 127 = 6 Vorzeichen: 0 (positive Zahl) 6 Die Zahl lautet also +1,008906 * 2 = +1,1008906 * 64 = 70,454 Abb. 1.2: IEEE-Formate für Short Real, Long Real und Temporary Real © Klaus Rittmeier 2014 1. Darstellung von Daten im Rechner Dez: Hex: Okt: Bin: A S C I I 65 41 101 1000001 83 53 123 01010011 67 43 103 01000011 73 49 111 01001001 73 49 111 01001001 Abb. 1.3: Codierung einer Zeichenkette Abb. 1.4: ASCII-Zeichentabelle Wichtige Steuerzeichen: NULL BELL HT/SK LF V/TAB FF CR ESC null character Audible Signal Horizontal Tabulation / Skip Line Feed Vertical Tabulation Form Feed Carriage Return Escape © Klaus Rittmeier 2014 1. Darstellung von Daten im Rechner 00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0 0 1 2 3 4 5 6 7 8 9 a b c d e f ╔═════════════════════════════════════════════════╗ ║ ☺ ☻ ♥ ♦ ♣ ♠ bel bs ht nl ♂ ♀ cr ♫ ☼ ║ ║ ► ◄ ↕ ‼ ¶ § ▬ ↨ ↑ ↓ → ← ∟ ↔ ▲ ▼ ║ ║ ! " # $ % & ' ( ) * + , - . / ║ ║ 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ║ ║ @ A B C D E F G H I J K L M N O ║ ║ P Q R S T U V W X Y Z [ \ ] ^ _ ║ ║ ` a b c d e f g h i j k l m n o ║ ║ p q r s t u v w x y z { | } ~ ⌂ ║ ║ Ç ü é â ä à å ç ê ë è ï î ì Ä Å ║ ║ É æ Æ ô ö ò û ù ÿ Ö Ü ø £ Ø × ƒ ║ ║ á í ó ú ñ Ñ ª º ¿ ® ¬ ½ ¼ ¡ « » ║ ║ ░ ▒ ▓ │ ┤ Á Â À © ╣ ║ ╗ ╝ ¢ ¥ ┐ ║ ║ └ ┴ ┬ ├ ─ ┼ ã Ã ╚ ╔ ╩ ╦ ╠ ═ ╬ ¤ ║ ║ ð Ð Ê Ë È ı Í Î Ï ┘ ┌ █ ▄ ¦ Ì ▀ ║ ║ Ó ß Ô Ò õ Õ µ þ Þ Ú Û Ù ý Ý ¯ ´ ║ ║ - ± ‗ ¾ ¶ § ÷ ¸ ° ¨ · ¹ ³ ² ■ ║ ╚═════════════════════════════════════════════════╝ Abb. 1.5: Der erweiterte ASCII-Zeichensatz (Codepage 437) UNICODE UTF-8 (Abk. für 8-bit Unicode Transformation Format (bzw. UCS Transformation Format) ist die am weitesten verbreitete Kodierung für Unicode-Zeichen. UTF-8 ist von der IETF (Internet Engineering Task Force), dem Unicode Consortium und der ISO (International Organisation for Standardisation) gegenwärtig identisch definiert in den Normdokumenten: • RFC 3629 / STD 63 (2003) • The Unicode Standard, Version 4.0, §3.9–§3.10 (2003) • ISO/IEC 10646-1:2000 Annex D (2000) Dabei wird jedem Unicode-Zeichen eine speziell kodierte Bytekette von variabler Länge zugeordnet. UTF-8 unterstützt bis zu vier Byte, auf die sich wie bei allen UTF-Formaten alle Unicode-Zeichen abbilden lassen. UnicodeBereich (hexadezimal) UTF-8-Kodierung (binär) 0000 0000 – 0000 007F 0xxxxxxx 0000 0080 – 0000 07FF 110xxxxx 10xxxxxx Bemerkungen Möglichkeiten (theoretisch) In diesem Bereich (128 Zeichen) entspricht UTF-8 genau dem ASCII-Code: Das 7 2 128 höchste Bit ist 0, die restliche 7-BitKombination ist das ASCII-Zeichen. 11 7 Das erste Byte enthält 2 − 2 1920 11 (2 ) (2048) binär 11xxxxxx, die © Klaus Rittmeier 2014 1. Darstellung von Daten im Rechner 0000 0800 – 0000 FFFF folgenden Bytes 10xxxxxx; die x stehen für die fortlaufende Bitkombination des Unicode-Zeichens. Die Anzahl der Einsen vor 0001 0000 – der höchsten 0 im 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxx ersten Byte ist die [0001 0000 – x Anzahl der Bytes für 001F FFFF] das Zeichen. (In Klammern jeweils die theoretisch maximal möglichen.) 1110xxxx 10xxxxxx 10xxxxxx 16 11 2 −2 16 (2 ) 20 2 21 (2 ) 63.488 (65.536) 1.048.576 (2.097.152) Das erste Byte eines UTF-8-kodierten Zeichens nennt man dabei Start-Byte, weitere Bytes nennt man Folgebytes. Startbytes enthalten also die Bitfolge 11xxxxxx oder 0xxxxxxx, Folgebytes immer die Bitfolge 10xxxxxx. • Ist das höchste Bit des ersten Bytes 0, handelt es sich um ein gewöhnliches ASCII-Zeichen, da ASCII eine 7-Bit-Kodierung ist und die ersten 128 Unicode-Zeichen den ASCII-Zeichen entsprechen. Damit sind alle ASCII-Dokumente automatisch aufwärtskompatibel zu UTF-8. • Ist das höchste Bit des ersten Bytes 1, handelt es sich um ein Mehrbytezeichen, also ein Unicode-Zeichen mit einer Zeichennummer größer als 127. • Sind die höchsten beiden Bits des ersten Bytes 11, handelt es sich um das Start-Byte eines Mehrbytezeichens, sind sie 10, um ein Folge-Byte. • Die lexikalische Ordnung nach Byte-Werten entspricht der lexikalischen Ordnung nach Buchstaben-Nummern, da höhere Zeichennummern mit entsprechend mehr 1-Bits im StartByte kodiert werden. • Bei den Start-Bytes von Mehrbyte-Zeichen gibt die Anzahl der höchsten 1-Bits die gesamte Bytezahl des als Mehrbyte-Zeichen kodierten Unicode-Zeichens an. Anders interpretiert, die Anzahl der 1-Bits links des höchsten 0-Bits entspricht der Anzahl an Folgebytes plus eins, z. B. 1110xxxx 10xxxxxx 10xxxxxx = drei Bits vor dem höchsten 0-Bit = drei Bytes insgesamt, zwei Bits nach dem höchsten 1-Bit vor dem höchsten 0-Bit = zwei Folgebytes. • Start-Bytes (0xxx xxxx oder 11xx xxxx) und Folge-Bytes (10xx xxxx) lassen sich eindeutig voneinander unterscheiden. Somit kann ein Byte-Strom auch in der Mitte gelesen werden, ohne dass es Probleme mit der Dekodierung gibt, was insbesondere bei der Wiederherstellung defekter Daten wichtig ist. 10xxxxxx Bytes werden einfach übersprungen, bis ein 0xxxxxxx oder 11xxxxxx Byte gefunden wird. Könnten Start-Bytes und Folge-Bytes nicht eindeutig voneinander unterschieden werden, wäre das Lesen eines UTF-8Datenstroms, dessen Beginn unbekannt ist, unter Umständen nicht möglich. Beispiele für UTF-8-Codierungen: Zeichen Unicode Unicode binär UTF-8 binär Buchstabe y 0079 Buchstabe ä Zeichen für eingetragene Marke ® 00E4 00000000 01111001 01111001 00000000 11100100 11000011 10100100 00AE 00000000 10101110 11000010 10101110 20AC 00100000 10101100 Eurozeichen € 11100010 10000010 10101100 UTF-8 hexadezimal 0x79 0xC3 0xA4 0xC2 0xAE 0xE2 0x82 0xAC © Klaus Rittmeier 2014 1. Darstellung von Daten im Rechner C/C++ Summe += 5 Compiler MOV AX, Summe Assemblersprache ADD AX, 05h MOV Summe, AX Maschinensprache 1010000 0000000 1.Befehl 0100000 0000010 0000010 2. Befehl 0000000 1010001 0000000 0100000 3. Befehl Abb. 1.6: Verhältnis von Hochsprache zur Maschinensprache © Klaus Rittmeier 2014