Wie viele Bits hat ein Byte?
Also wenn die Antwort „acht“ lautet, dann solltest Du weiterlesen, wenn sie „das kommt darauf an“ lautet, dann kannst Du Dir diesen Blog schenken.
Im Prinzip speichern ja alle Computer ihre Daten in Form von einzelnen Bits. Lange Zeit wurden auch Speichermodule, egal ob dies Ringkernspeicher oder DRAM waren, bitweise angesprochen (heute ist, damit man bei 32 bzw. 64 Bit pro Datenzugriff, nicht so viele Chips benötigt es gängig vier Bits pro Zugriff zu speichern).
Doch mit einzelnen Bits können die wenigsten Computer etwas anfangen. Es gibt relativ wenige Rechner, die Befehle für den Zugriff auf einzelne Bits haben. Der Z80 hatte solche Befehle, die ich aber nie benutzt habe. In jedem Falle adressieren aber Computer nicht einzelne Bits, sondern immer mehreree Bits auf einmal die eine Einheit bilden. Auf ein Bit greift man dann mit Masken zu. Dazu lädt man die Einheit (n Bits) in ein Register und verknüpft dieses mit einer Konstante, die ein Bit setzt oder rücksetzt. Mit einer logischen ODER-Verknüpfung bei der das richtige Bit gesetzt ist kann man ein Bit setzen, ohne die anderen zu verändern (z.B OR 0001 000B um das fünfte Bit zu setzen. Mit einem logischen Und kann man ein Bit zurücksetzen, bei der Maske sind dann alle Bits auf „1“ bis auf das zurücksetzende (AND 1110 1111B würde das fünfte Bit zurücksetzen und mit logischem Und, diesmal aber invertierter Maske (alle 0 bis auf das zu prüfende Bit) kann man testen, ob ein Bit gesetzt ist oder nicht (AND 0001 000B setzt nach der Operation das Zero-Flag, wenn das Bit nicht gesetzt war).
Computer griffen auf ihren Speicher meistens in größeren Portionen zu, die sich nach der Breite des Datenbusses richteten und der war oft (nicht immer) genauso breit wie die internen Register. Beherrschte ein Computer nur diesen Zugriff, nicht auf den von einzelnen Bytes, so griff er „wortweise“ auf den Speicher zu, entsprechend organisiert war der Speicher dann auch in Worten und nicht Bytes. Das gab es bei Superrechnern (Cray 1) wie Mikroprozessoren (TMS 9900). Die meisten Computer beherrschten aber noch den byteweisen Zugriff, weil sehr oft das Byte die grundlegende Informationseinheit war und nicht das Bit.
Die Gruppierung von Bits zu einem Byte kam dadurch, dass zwar Computer am besten mit Zahlen umgehen, aber in der Praxis sie es auch mit Buchstaben zu tun haben, selbst wenn die Programme nur Zahlen verarbeiten wie dies oft der Fall war, so bestand der Programmquelltext doch aus Buchstaben. Er musste verarbeitet werden und zumindest für einige Meldungen musste man auch in Buchstaben ausgeben und Befehle wurden auch Buchstabenweise eingetippt.
Am Anfang orientierte man sich danach, welche Zeichen man eingeben konnte. Lange Zeit war das Standardeingabegerät ein umgebauter Fernschreiber und die alten Exemplare kannten nur Großbuchstaben. Dafür reichten 5 Bits, doch das war für Programme zu wenig. Dazu kamen dann noch die Ziffern 0 bis 9 und einige Sonderzeichen wie Klammern, Satzzeichen. Sie benötigte man damals nicht für Texte sondern Programmiersprachen. Auch wenn es Ausnahmen gab. COBOL vermied z.B. Zeichen wie + – * / und man schrieb ADD, SUBTRACT, MULTIPLY und DIVIDE. Die ersten Programmiersprachen wie FORTRAN und COBOL nutzten denn auch in den Programmen nur Großbuchstaben und die Sonderzeichen. Für diesen Menge an Zeichen reichten aber 6 Bit für 64 Zeichen. Entsprechend war ein Byte sehr lange Zeit eine Datenmenge von 6 Bit und ganze Rechnerfamilien kann man an dieser Ausrichtung erkennen. So die ersten Supercomputer Cyber 6600 und 7600. Sie waren Rechner mit einem Adressraum von 18 Bit (3 x 6 Bit) und konnte Zahlen von 60 Bit (10 x 6 Bit) verarbeiten. Die Firma PDP stellte Minicomputer mit 12 Bit, 18 Bit und 36 Bit Datenbusbreite her . Allesamt vielfache von 6 Bit. Es gab zur gleichen Zeit (sechziger Jahre) durchaus auch Rechner die 8 Bit für ein Byte verwendeten, wie die IBM 360 Familie, aber es gab keinen direkten Nutzen des nun erweiterten Codes der nun 256 Zeichen erlaubte.
Problematisch war nicht nur das ein Byte mal sechs, mal acht Bits groß war, sondern vor allem das jeder Hersteller eine eigene Zuordnung hatte. So hatte der Buchstabe „A“ bei IBM einen anderen Code als bei DEC. Das hatte sicher auch den erwünschten Nebeneffekt, dass man die Peripheriegeräte auch vom selben Hersteller kaufen musste sollte der Ausdruck noch lesbar sein und der Rechner die Eingabe vom Terminal verstehen.
Die US-Regierung die verschiedenste Systeme in verschiedenen Organisationen wie Militär, NASA, Forschung, Verwaltung im Einsatz hatte, ärgerte sich über diesen Missstand und standardisierte schon 1963 die Codetabellen und es erschien die erste Version ASCII – American Standard Code for Information Interchange. Wie der Name sagt, ging es darum das man Daten, damals noch vornehmlich auf Magnetbändern zwischen Rechnern austauschen konnte, aber auch Peripheriegeräte immer denselben Zeichensatz verstanden.
Schon von Anfang an, das war 1963, war dieser Zeichensatz 7 Bits groß, konnte also 96 Zeichen aufnehmen. So viele braucht man nicht. Selbst mit einigen neuen Zeichen für Computer, die man auf einer Schreibmaschine nicht findet, wie den beiden neuen Klammertypen [] und {} benötigte man nicht mehr als 96 Zeichen. Die ersten 32 Zeichen sind daher nicht definiert und wurden sehr bald genutzt als Steuerzeichen. Einige sind standardisiert wie #9 für den Tabulator, #13 für den Wagenrücklauf, #10 für den Zeilenvorschub und #12 für einen Seitenvorschub (beim Bildschirm löschen des Bildschirms, beim Drucker vorschieben des Papiers). Doch schon bei den wenigen Zeichen, die man dafür benötigte, gab es keine Übereinkunft. Bei einem Hersteller musste man für eine neue Zeile zum Drucker #13 und #10 schicken, beim anderen nur #13. Bis heute unterscheiden sich Textdateien von Unix und Windows Systemen in diesem Detail. Erst recht waren die anderen Zeichen in diesem Bereich nicht standardisiert. Sie wurden vor allem von Bildschirmterminals für Funktionen wie Cursorpositionierung oder Editierfunktionen (löschen bis zum Zeilenende / Seitenende etc.) genutzt.
Zum Durchbruch für das 8 Bit Byte verhalf ein Regierungserlass, der nach der zweiten Fassung von 1968 verabschiedet wurde. Danach dürften Regierungsstellen nur noch neue Computer anschaffen, welche den ASCII Standard einhielten, also einen 7 Bit Zeichensatz nach diesem Standard zumindest unterstützten. Das war das Ende der 6 Bit Architekturen und neue Rechner setzten nun auf das 8 Bit Byte und entsprechende Wortbreiten. Bei DEC führte man dann Architekturen mit 16 oder 32 Bits ein.
Was man auch versäumt hat, weil es ja der US-Regierung nur um den US-Markt ging, war zu bedenken, das es in Europa noch einige Sonderzeichen mehr gibt. In Deutschland die Umlaute und das ß, in zahlreichen romanischen Sprachen Vokale mit Akzenten und in Skandinavien wieder andere, insgesamt sind es, aber nicht so viele Zeichen mehr, mit 30 zusätzlichen Zeichen könnte man sieben europäische Sprachen mit abdecken. Da alle Computerhersteller schließlich nicht die 7 Bit des ASCII, sondern 8 Bit für ein Byte als Zeichensatz verwendeten, wäre hier etwas weiter denken sinnvoll gewesen. So musste ich bei meinem 8 Bit Computer, der aus England kam, wenn ich Textverarbeitung betreiben wollte, vorher ein Programm laden das einige Zeichen mit neuen Bitmaps versah. Wollte ich dann Programmieren war dasselbe in der anderen Richtung nötig, denn die belegten Zeichen waren in meiner Programmiersprache wichtig (es waren [] {} | \ und ^).
Da ein Byte dann 8 Bit hatte – 7 Bit hätten ja auch gereicht, aber wahrscheinlich wollte man lieber gerade Zweierpotenzen haben, waren die Zeichen mit den Nummern 128 bis 255 im ASCII-Standard undefiniert. Die konnte man nutzen um den Textmodus aufzupeppen. Sehr lange hat sich dies beim VGA-Textmodus gehalten wo Programme von Norton und Borland extensiv diese Zeichen nutzten um Rahmen und Schatten zu zeichnen. Die ersten Heimcomputer, die keine Grafik sondern nur einen Textmodus hatten, implementierten dort Spielfiguren in verschiedenen Posen um Animationen zu ermöglichen. Andere machen Blockgrafik daraus – opfert man 16 Zeichen, so kann man Blockgrafik mit der doppelten Auflösung des Bildschirms erzeugen (also 160 x 50 Punkte bei einem 80 x 25 Zeichen Bildschirm).
Erstaunlicherweise finden wir in der Frühzeit der Heimcomputer wieder das zurückgehen auf den 6 Bit Zeichensatz – sowohl Tandy TRS-80 wie Apple ][ (in Deutschland Apple ÖÄ – sie ahnen warum) hatten in ihrem Zeichensatz keine Kleinbuchstaben. Zwar speicherten sie die Information nach ASCII in einem 8-Bit-Byte ab, aber im reinen Textmodus muss man aus einem Charakter-ROM die Bitmap holen, um sie auf dem Bildschirm auszugeben. Typisch waren damals 6 bis 8 Byte für die Bitmap eines Buchstabens und so sparte man mit 26 Buchstaben weniger eben 156 bis 208 Byte ein – bei einem ROM von nur 4 KByte Größe des Tandy TRS-80 durchaus eine Größe die zählt. Beim Apple II lag es wohl eher daran, dass Wozniak überhaupt nicht daran dachte, das Kleinbuchstaben eine Bedeutung hätten, sein BASIC kannte ja auch keine Fließkommazahlen. Er hatte es für die Programmierung von Spielen geschrieben und da gibt es maximal einige Titel und Meldungen, die aus Text bestehen.
Für Peripheriehersteller war das aber ein Nachteil, auch weil die Zeichen über 128 nicht standardisiert waren. Es gab spezielle Druckeranpassungen für populäre Rechner wie den C64. Ich hatte damals einen Star NL-10 Nadeldrucker, bei dem man mit dem Cartridge den Zeichensatz austauschen konnte, damit konnte er den ganzen Zeichensatz eines IBM PC aber auch die Zeichen meines Computers ausgeben.
Das ganze hat sich erst geändert, als der Unicode eingeführt wurde der nun Zeichen vieler Sprachen beinhaltet und momentan 145.000 Zeichen umfasst. Ursprünglich war es ein 16-Bit-Code, aber der reichte dann auch nicht aus. Unicode ist aber relativ jung, der heutige Standard stammt vom Juli 1996. Vorher war das Zeichenirrwar vorprogrammiert. Man konnte sich nicht mal darauf verlassen, das zwei Zeichensätze von ein und demselben Hersteller passten. So verwendet Windows einen anderen Zeichensatz als DOS, obwohl beides von Microsoft stammt.
Ist der Begriff „Byte“ inzwischen nicht in diversen IEC Normen eindeutig definiert?
Ansonsten nehme man den französischen Begriff des „octet“, da gibt es keine Mehrdeutigkeit 🙂
Heute ja, aber es geht ja in dem Artikel um die historische Entwicklung.
Zur Zeit der 18Bit / 36Bit Rechner gab es neben den 6Bit Bytes auch 9Bit Bytes, die verwendet wurden, wenn man über bit shift auf die Bytes zugreifen wollte, z.B. in Arrays. Ein Problem dabei war, daß dann die Byte Pointer 36Bit lang waren, während alle anderen Pointer nur 18Bit lang waren.
Es soll auch Systeme mit 10Bit Bytes gegeben haben, aber mir fällt außer vielleicht Lisp Maschinen wenig ein mit 20Bit Adressgröße. Vielleicht Workstations basierend auf Bitslice Technik ähnlich wie die Lilith?
Anfang der 90er gab es Grafik CPUs mit sizeof(byte/char) == sizeof(short) == sizeof(long). Mein Chef und ein ehemaliger Kollege haben gelegentlich davon erzählt, X11 auf so etwas portiert zu haben, was nicht einfach war.