====== Integer-Datentypen ====== ===== Die Grunddatentypen ===== Die wichtigsten Datentypen Die wichtigsten Datentypen in C sind [[char]], [[short]] und [[long|long int]] Ein [[char]] ist ein ein [[glossary:Byte]] großer Speicher, in dem eine Zahl von -128 bis 127 gespeichert werden kann oder auch ein [[theory:encoding:ascii|ASCII]]-Zeichen. [[short]] hingegen ist 2 [[glossary:Byte|Bytes]] groß und kann eine Zahl von -32768 bis 32767 aufnehmen. [[long|long int]] verdoppelt die Kapazität nochmals (auf 4 [[glossary:Byte|Bytes]]) und ermöglicht es eine Zahl von -2147483648 bis 2147483647 zu speichern. Weiß man also genau, dass man nur Zahlen im Rahmen von -128-+127 benutzt, besteht so die Möglichkeit Speicher zu sparen, indem man genau bestimmt, dass der Computer auch nur ein [[Byte]] ([[char]]) benutzt. Oft benutzt, aber keine festgelegte Bedeutung hat der Datentyp int (integer), der gewissermaßen aus Pascal übernommen wurde. Problem dieses Datentyps ist jedoch, dass er auf dem Amiga und auf dem PC unterschiedlich definiert wurde: Auf dem alten PCs (ursprünglich 16-Bit-Rechner) ist [[int]] gleichbedeutend mit [[short]], auf dem Amiga, Macs, wie neueren PCs dessen Prozessoren grundsätzlich eine Breite von 32 Bit haben, wurde int also mit [[long|long int]] gleichgesetzt. [[int]] ist **meistens** als 32 [[glossary:Bit]] breit definiert. Es gibt aber keine Garantie, sollte man also damit rechnen, dass das eigene Programm auf einem alten Compiler kompiliert werden soll, sollte man besser [[long|long int]] verwenden, um 32 [[glossary:Bit]] (oder mehr) zu erhalten. [[long|long int]] kann man zumeist einfach mit [[long]] abkürzen. Auf 64 [[glossary:Bit]] Systemen wird's dann noch schwieriger, wenn int wieder 32 Bit ist, [[longlong|long long int]] aber 64 Bit groß. Der Standard definiert für diese Datentypen nur die Mindestgröße, die für [[int]] 16 [[glossary:Bit]] beträgt und für [[long|long int]] 32 [[glossary:Bit]]. Es darf aber auch mehr sein. In aktueller C-Norm finden sich auch Datentypen, die klar vorgeben, wie groß ein integer sind. Diese sind allerdings noch nicht weit verbreitet. Die genauen Größen der einzelnen Datentypen für Dein System findest Du in der Standard-C-Library im Header [[c:lib:limits:start|limits.h]]. Diese drei Datentypen entstehen dadurch, dass moderne Prozessoren auf den Arbeitsspeicher Byteweise (8 Bit), Wortweise(16 Bit) oder Langwortweise(32 [[glossary:Bit]]) zugreifen können. ===== signed / unsigned ===== Häufig braucht man keine negativen Zahlen. Dafür besteht die Möglichkeit, die bisher vorgestellten Dateitypen zu verändern, indem man dem Compiler mitteilt, dass kein Vorzeichen notwendig ist. Um dies zu erreichen, benutzt man das Schlüsselwort [[unsigned]]. Im Sourcecode wird vor den Datentyp einfach [[unsigned]] vorgesetzt, also [[unsigned]] [[char]], [[unsigned]] [[short]] und [[unsigned]] [[long|long int]]. Damit werden die Zahlenbereiche also von 0-255 ([[unsigned]] [[char]]), 0-65535([[unsigned]] [[short]]) und 0-4294967295 ([[unsigned]] [[long|long int]]) verschoben. Als Gegenstück existiert das Schlüsselwort [[signed]] (also [[signed]] [[char]], [[signed]] [[short]], [[signed]] [[long|long int]]), was zwar zu den gerade mal 31 Schlüsselwörtern gezählt wird, jedoch wohl kaum in einem Sourcecode auftauchen wird. Der Grund liegt einfach darin, dass jeder (mir bekannte) Compiler einen Datentyp ohne das Schlüsselwort [[unsigned]] Variablen automatisch als [[signed]] anmeldet und daher kein Programmierer sich die Arbeit macht, das Schlüsselwort [[signed]] noch einmal extra vor den Datentyp zu schreiben. ===== Faule Programmierer ===== Da es den meisten Programmierern aber auch das zu viel Tipparbeit ist, die Datentypen mit dem Schlüsselwort unsigned auszuschreiben, finden sich häufig Umschreibungen für die Datentypen und tragen nun die entsprechenden Namen, wie die Datentypen in Assembler benannt sind. Parallel dazu wurden die signed Datentypen umbenannt. BYTE = (signed) char UBYTE = unsigned char WORD = (signed) short UWORD = unsigned short LONG = (signed) long ULONG = unsigned long Zu beachten ist, dass die nachträglich definierten Dateitypen groß geschrieben werden, die originalen Dateitypen klein. Ebenfalls klein geschrieben werden die Schlüsselwörter signed und unsigned. Diese Definitionen sind nicht Teil der Sprache C, dennoch finden sie sich in verschiedenen Projekten so oder ähnlich wieder. Weiterhin wurde der Datentyp BOOL definiert, der nur die Zahlen NULL (FALSE) und Eins (TRUE) annehmen soll und damit nur Wahrheitsaussagen machen darf. Dies ist sinnvoll, wenn man nur kurze Antworten von einer Prozedur wünscht. Schreibt man zum Beispiel eine Prozedur, die Speicher für das Programm besorgt und zum Beispiel ein Fenster öffnet, kann diese eine Aussage machen im Sinne, dass alles geklappt hat und das Programm starten kann oder, dass ein Fehler aufgetreten ist und das Programm abbrechen soll.