neuerlehrplan:gk:zahl_zeichen_codierung
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| neuerlehrplan:gk:zahl_zeichen_codierung [2025/11/21 11:08] – [Negative ganze Zahlen] lutz | neuerlehrplan:gk:zahl_zeichen_codierung [2026/03/02 17:19] (aktuell) – gelöscht lutz | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== 1.2 Zahl- und Zeichenkodierung in Rechnersystemen ====== | ||
| - | ===== Zahldarstellung in Rechnersystemen ===== | ||
| - | |||
| - | ==== Negative ganze Zahlen ==== | ||
| - | |||
| - | Wie wir bereits aus den vorherigem Abschnitt wissen, kann man positive ganze Zahlen im Computer einfach als Dualzahlen darstellen. Wie kann man nun aber im Computer negative Zahlen darstellen? Eine Möglichkeit ist das [[zahlsysteme# | ||
| - | |||
| - | Betrachten wir dazu den Datentyp **byte** aus der Programmiersprache [[https:// | ||
| - | |||
| - | **Beispiel 1** Codierung der Zahl -6: | ||
| - | |||
| - | < | ||
| - | Dualdarstellung der Zahl 6 bei 8 Bit Wortbreite: 00000110 | ||
| - | Einerkomplement: | ||
| - | Zweierkomplement: | ||
| - | </ | ||
| - | |||
| - | Die -6 wird also durch 11111010 repräsentiert. | ||
| - | |||
| - | Wenn man nun 6 und -6 addiert muss sich Null ergeben: | ||
| - | |||
| - | < | ||
| - | 00000110 | ||
| - | + 11111010 | ||
| - | | ||
| - | </ | ||
| - | |||
| - | Da das führende neunte Bit (die 1) bei 8 Bit Breite einfach weg fällt, bleiben 8 Bits mit 0, also die Zahl 0 übrig. | ||
| - | |||
| - | In den meisten Programmiersprachen werden negative ganze Zahlen mit Hilfe des Zweierkomplements dargestellt, | ||
| - | |||
| - | Eine Sonderrolle spielt Python. Python kennt beliebig große (bzw. kleine) ganze Zahlen. | ||
| - | |||
| - | ==== Darstellung ganzer Zahlen in Python ==== | ||
| - | |||
| - | Python speichert eine ganze Zahl in zwei Datenstrukturen: | ||
| - | |||
| - | * **ob_size** ganze Zahl, die die Anzahl der Stellen der Integer-Zahl angibt, dabei gilt: | ||
| - | * ob_size > 0 -> positive Zahl | ||
| - | * ob_size = 0 -> 0 | ||
| - | * ob_size < 0 -> negative Zahl | ||
| - | * **ob_digit[]** ist eine Liste mit maximal 30-stelligen Binärzahlen. Sie repräsentieren eine Zahl in einem Stellenwertsystem mit der Basis $2^{30}$. | ||
| - | |||
| - | ==== Darstellung von Kommazahlen ==== | ||
| - | |||
| - | === Binäre Gleitkommazahlen === | ||
| - | |||
| - | Der heutige Standard für die Darstellung von Kommazahlen sind **binäre Gleitkommazahlen** nach der Norm **IEEE 754**. Bei einer Wortbreite von 64 ist die Zahl dann wie folgt aufgebaut: | ||
| - | |||
| - | * **1 Bit**: Vorzeichen (0-positiv, 1-negativ) | ||
| - | * **11 Bit**: Exponent der Zweierpotenz (1023 entspricht dem Exponent 0 um auch negative Exponenten darstellen zu können) | ||
| - | * **52 Bit**: Mantisse -> dezimale Dualzahl, die immer mit 1. beginnt und den Wert der Zahl ohne Potenz repräsentiert | ||
| - | |||
| - | **Beispiel 2** | ||
| - | |||
| - | Betrachten wir zum Beispiel den Dezimalbruch 5,5. Um die Zahl als binäre Gleitkommazahl darzustellen, | ||
| - | |||
| - | $5.5 = 4 + 1 + \dfrac{1}{2} =(101.1)_2$ | ||
| - | |||
| - | Dann spalten wir die Zweierpotenz ab, so dass vor dem Komma (Dezimalpunkt) eine 1 steht: | ||
| - | |||
| - | $(101.1)_2 = (1.011)_2 \cdot 2^2$ | ||
| - | |||
| - | Somit ergibt sich: - Vorzeichen: 0 - Exponent: $1023 + 2 = 1025 = (10000000001)_2$ (,da 1023 dem Exponent 0 entspricht) - Mantisse .011 (die 1 wird als gesetzt angenommen) | ||
| - | |||
| - | Damit ergibt sich im Computerspeicher für die Zahl 5,5 das folgende Bitmuster: | ||
| - | |||
| - | < | ||
| - | 0 10000000001 0110000000000000000000000000000000000000000000000000 | ||
| - | </ | ||
| - | |||
| - | 5,5 lässt dich als binäre Gleitkommazahl recht gut darstellen, da $0,5 = \dfrac{1}{2}$ gleich eine Zweierpotenz mit negativen Exponenten ist. Andere Zahlen wie z.B. 0,2 lassen sich nicht exakt darstellen und es kommt zu kleinen Abweichungen. Andererseits ist der Zugriff auf binäre Gleitkommazahlen durch den Prozessor sehr schnell. | ||
| - | |||
| - | Binäre 64 Bit-Gleitkommazahlen kommen in Python beim Datentyp float und bei C/C++/Java beim Datentyp double zum Einsatz. | ||
| - | |||
| - | === Dezimale Gleitkommazahlen === | ||
| - | |||
| - | Diese kommen zum Einsatz, wenn man exakte Dezimalzahlen benötigt werden. In Python werden sie durch den Datentyp decimal.Decimal, | ||
| - | |||
| - | $\pm d.dddd \cdot 10^e$ | ||
| - | |||
| - | Im Unterschied zu binären Gleitkommazahlen ist dieser Datentyp langsamer und braucht mehr Speicher. | ||
| - | |||
| - | === Festkommazahen === | ||
| - | |||
| - | Bei Festkommazahlen wird eine feste Anzahl als Stellen als Vorkommastellen und eine feste Anzahl an Stellen als Nachkommastellen. Das Komma steht immer an derselben Stelle. Bei einer 16 Bit - Festkommazahl repräsentieren die ersten 8 Bit die Zahl vor dem Komma und die hinteren 8 Bit die Stellen nach dem Komma. | ||
| - | |||
| - | Um die Zahl 36,75 als Festkommazahl darzustellen, | ||
| - | |||
| - | $36.75 = 32 + 4 + \dfrac{1}{2} + \dfrac{1}{4}$ | ||
| - | |||
| - | Der ganzzahlige Anteil wird dann durch die ersten 8 Bit dargestellt, | ||
| - | |||
| - | < | ||
| - | 00100100 11000000 | ||
| - | </ | ||
| - | |||
| - | Festkommazahlen sind sehr schnell und exakt und haben wenig Speicherbedarf. Sie sind aber sehr unflexibel und haben einen begrenzten Wertebereich. ## Zeichendarstellung in Rechnersystemen | ||
| - | |||
| - | ==== ASCII-Code ==== | ||
| - | |||
| - | Zeichen werden im Computer als Zahlen codiert. In den ersten Computersystemen hatte jeder Computer seine eigene Codierung. Um diese Codierung zu vereinheitlichen wurde 1963 der ASCII-Code (American Standard Code for Information Interchange) eingeführt. Mit 7 Bit werden dabei den Zahlen 0-127 Zeichen zugeordnet. Das 8. (führende) Bit wurde zunächst als Paritätsbit zur Fehlererkennung genutzt. Der ASCII-Code bis 0-127 enthält das gesamte englische Alphabet, die Ziffern 0 bis 9 und einige druckbare und nicht druckbare Zeichen. | ||
| - | |||
| - | === ASCII-Zeichentabelle (0-127) === | ||
| - | |||
| - | Vollständige ASCII-Tabelle mit dezimaler, hexadezimaler und binärer Codierung aller Zeichen von 0-127. | ||
| - | |||
| - | < | ||
| - | | Dez | Hex | Bin | Zeichen | Dez | Hex | Bin | Zeichen | | ||
| - | |-----|-----|----------|---------|-----|-----|----------|---------| | ||
| - | | 0 | 00 | 00000000 | | ||
| - | | 1 | 01 | 00000001 | | ||
| - | | 2 | 02 | 00000010 | | ||
| - | | 3 | 03 | 00000011 | | ||
| - | | 4 | 04 | 00000100 | | ||
| - | | 5 | 05 | 00000101 | | ||
| - | | 6 | 06 | 00000110 | | ||
| - | | 7 | 07 | 00000111 | | ||
| - | | 8 | 08 | 00001000 | | ||
| - | | 9 | 09 | 00001001 | | ||
| - | | 10 | 0A | 00001010 | | ||
| - | | 11 | 0B | 00001011 | | ||
| - | | 12 | 0C | 00001100 | | ||
| - | | 13 | 0D | 00001101 | | ||
| - | | 14 | 0E | 00001110 | | ||
| - | | 15 | 0F | 00001111 | | ||
| - | | 16 | 10 | 00010000 | | ||
| - | | 17 | 11 | 00010001 | | ||
| - | | 18 | 12 | 00010010 | | ||
| - | | 19 | 13 | 00010011 | | ||
| - | | 20 | 14 | 00010100 | | ||
| - | | 21 | 15 | 00010101 | | ||
| - | | 22 | 16 | 00010110 | | ||
| - | | 23 | 17 | 00010111 | | ||
| - | | 24 | 18 | 00011000 | | ||
| - | | 25 | 19 | 00011001 | | ||
| - | | 26 | 1A | 00011010 | | ||
| - | | 27 | 1B | 00011011 | | ||
| - | | 28 | 1C | 00011100 | | ||
| - | | 29 | 1D | 00011101 | | ||
| - | | 30 | 1E | 00011110 | | ||
| - | | 31 | 1F | 00011111 | | ||
| - | |||
| - | |||
| - | | Dez | Hex | Bin | Zeichen | Dez | Hex | Bin | Zeichen | | ||
| - | |-----|-----|----------|---------|-----|-----|----------|---------| | ||
| - | | 64 | 40 | 01000000 | @ | 96 | 60 | 01100000 | ` | | ||
| - | | 65 | 41 | 01000001 | A | 97 | 61 | 01100001 | a | | ||
| - | | 66 | 42 | 01000010 | B | 98 | 62 | 01100010 | b | | ||
| - | | 67 | 43 | 01000011 | C | 99 | 63 | 01100011 | c | | ||
| - | | 68 | 44 | 01000100 | D |100 | 64 | 01100100 | d | | ||
| - | | 69 | 45 | 01000101 | E |101 | 65 | 01100101 | e | | ||
| - | | 70 | 46 | 01000110 | F |102 | 66 | 01100110 | f | | ||
| - | | 71 | 47 | 01000111 | G |103 | 67 | 01100111 | g | | ||
| - | | 72 | 48 | 01001000 | H |104 | 68 | 01101000 | h | | ||
| - | | 73 | 49 | 01001001 | I |105 | 69 | 01101001 | i | | ||
| - | | 74 | 4A | 01001010 | J |106 | 6A | 01101010 | j | | ||
| - | | 75 | 4B | 01001011 | K |107 | 6B | 01101011 | k | | ||
| - | | 76 | 4C | 01001100 | L |108 | 6C | 01101100 | l | | ||
| - | | 77 | 4D | 01001101 | M |109 | 6D | 01101101 | m | | ||
| - | | 78 | 4E | 01001110 | N |110 | 6E | 01101110 | n | | ||
| - | | 79 | 4F | 01001111 | O |111 | 6F | 01101111 | o | | ||
| - | | 80 | 50 | 01010000 | P |112 | 70 | 01110000 | p | | ||
| - | | 81 | 51 | 01010001 | Q |113 | 71 | 01110001 | q | | ||
| - | | 82 | 52 | 01010010 | R |114 | 72 | 01110010 | r | | ||
| - | | 83 | 53 | 01010011 | S |115 | 73 | 01110011 | s | | ||
| - | | 84 | 54 | 01010100 | T |116 | 74 | 01110100 | t | | ||
| - | | 85 | 55 | 01010101 | U |117 | 75 | 01110101 | u | | ||
| - | | 86 | 56 | 01010110 | V |118 | 76 | 01110110 | v | | ||
| - | | 87 | 57 | 01010111 | W |119 | 77 | 01110111 | w | | ||
| - | | 88 | 58 | 01011000 | X |120 | 78 | 01111000 | x | | ||
| - | | 89 | 59 | 01011001 | Y |121 | 79 | 01111001 | y | | ||
| - | | 90 | 5A | 01011010 | Z |122 | 7A | 01111010 | z | | ||
| - | | 91 | 5B | 01011011 | [ |123 | 7B | 01111011 | { | | ||
| - | | 92 | 5C | 01011100 | \ |124 | 7C | 01111100 | | | | ||
| - | | 93 | 5D | 01011101 | ] |125 | 7D | 01111101 | } | | ||
| - | | 94 | 5E | 01011110 | ^ |126 | 7E | 01111110 | ~ | | ||
| - | | 95 | 5F | 01011111 | _ |127 | 7F | 01111111 | | ||
| - | </ | ||
| - | |||
| - | === Legende der Steuerzeichen (0-31) === | ||
| - | |||
| - | * **NUL**: Null-Zeichen | ||
| - | * **SOH**: Start of Heading | ||
| - | * **STX**: Start of Text | ||
| - | * **ETX**: End of Text | ||
| - | * **EOT**: End of Transmission | ||
| - | * **ENQ**: Enquiry | ||
| - | * **ACK**: Acknowledge | ||
| - | * **BEL**: Bell | ||
| - | * **BS**: Backspace | ||
| - | * **HT**: Horizontal Tab | ||
| - | * **LF**: Line Feed | ||
| - | * **VT**: Vertical Tab | ||
| - | * **FF**: Form Feed | ||
| - | * **CR**: Carriage Return | ||
| - | * **SO**: Shift Out | ||
| - | * **SI**: Shift In | ||
| - | * **DLE**: Data Link Escape | ||
| - | * **DC1-DC4**: | ||
| - | * **NAK**: Negative Acknowledge | ||
| - | * **SYN**: Synchronous Idle | ||
| - | * **ETB**: End of Transmission Block | ||
| - | * **CAN**: Cancel | ||
| - | * **EM**: End of Medium | ||
| - | * **SUB**: Substitute | ||
| - | * **ESC**: Escape | ||
| - | * **FS**: File Separator | ||
| - | * **GS**: Group Separator | ||
| - | * **RS**: Record Separator | ||
| - | * **US**: Unit Separator | ||
| - | * **DEL**: Delete (ASCII 127) | ||
| - | |||
| - | **Hinweis**: | ||
| - | |||
| - | ==== Erweiterter ASCII-Zeichensatz - Codepages ==== | ||
| - | |||
| - | Im Laufe der Zeit fanden Computer immer mehr Verbreitung und mit dem 7 Bit - ASCII-Zeichensatz war es nicht möglich, Sonderzeichen in den einzelnen Sprachen anzuzeigen, wie z.B. die deutschen Umlaute (ä, ö, ü …). Deshalb benutzte man das Paritätsbit mit zur Zeichencodierung und man konnte somit auch die Zeichen 128 bis 255 codieren. Je nach Land und Computersystem gab es dabei unterschiedliche Codepages. Hier sind einige Beispiele: | ||
| - | |||
| - | * **[[https:// | ||
| - | * **[[https:// | ||
| - | * **[[https:// | ||
| - | * **[[https:// | ||
| - | |||
| - | ==== Unicode - UTF-8 ==== | ||
| - | |||
| - | Mit der Zeit wurde die Anzahl der Zeichen noch größer und es war umständlich am Computer die Codepages zu wechseln, wenn unterschiedliche Zeichen benötigt wurden. Deshalb begann man ab 1988 einen universellen Zeichencode zu entwickeln, der bis zu 4 Byte benutzte, um Zeichen zu codieren. Die flexibelste Variante von Unicode ist [[https:// | ||
neuerlehrplan/gk/zahl_zeichen_codierung.1763719726.txt.gz · Zuletzt geändert: von lutz
