Ganzzahltypen

Es gibt in C++ verschiedene Ganzzahltypen, die unterschiedliche Wertebereiche abdecken können. Hierbei ist zu beachten, dass in C++ der Wertebereich nicht exakt bestimmt ist. C++ legt nicht exakt fest wie viel Speicher für einen bestimmten Datentypen verwendet werden muss. Der C++ Standard sieht lediglich eine Mindestgröße vor. 

DatentypBytes (mindestens)Wertebereich (mindestens)
char1mit Vorzeichen (signed)-128 bis +127ohne Vorzeichen (unsigned)0 bis 255
short2-32.768 bis +32.767
int2-32.768 bis +32.767
long4-2.147.483.648 bis +2.147.483.647
long long8-9,223.372.036.854.775.808 bis +9,223.372.036.854.775.807

Mit- und ohne Vorzeichen 

Wenn man ohne weitere Angaben einen Ganzzahltyp verwendet, steht einem per default der negative und der positive Bereich zur Verfügung. Möchte man nun allerdings festlegen, dass man die Ganzzahl ohne Vorzeichen verwenden möchte, kann das Schlüsselwort unsigned verwendet werden. 

unsigned int positiv = 0;

Im genannten Beispiel können in der Variablen positiv nur noch positive Werte gespeichert werden. Der Wertebereich wird dadurch verschoben auf 0 bis +65.565 Ausprägungen verschoben. Die Speichermenge bleibt hierbei die gleiche!

Wenn einer vorzeichenlosen Variablen ein Wert mit Vorzeichen zugewiesen wird, wird dieser Wert in einen Wert ohne Vorzeichen konvertiert. 

Für die bessere Lesbarkeit kann bei den Zahlen zwischen zwei Dezimalziffern ein Apostrophzeichen eingefügt werden. Beispiel: 1’000’000

    /*
        Ausgabe:
        Dezimal: 254
        Oktal: 254
        Hexadezimal: 254
        Binary: 254
        Für Dezimal, Okatal, Hexadezimal und Binärdaten 
        kann der Datentyp Integer verwendet werden. 
        Der Kompiler erkennt am Präfix, ob es sich um eine 
        Dezimal-, eine Oktalzahl, einem Hexadezimalen 
        oder binären Wert handelt. 
    */
    int dez = 254; // Dezimal
    int okt = 0376; // Oktal
    int hex = 0xFE; // Hexadezimal
    int bin = 0b1111'1110; // Binär
    std::cout << "Dezimal: " << dez << "\n";
    std::cout << "Oktal: " << okt << "\n";
    std::cout << "Hexadezimal: " << hex << "\n";
    std::cout << "Binary: " << bin << "\n";

Suffixe in Ganzzahlliteralen

Einem Ganzzahlliteral kann neben einem Präfix auch ein Suffix mitgegeben werden. Hierbei kann ein Suffix bspw. kennzeichnen ob, es sich um einen Vorzeichenlosen Wert (unsigned, u oder U) oder ob es sich um einen long Wert (l oder L) handelt. Die Suffixe können hierbei auch kombiniert werden. Zum Beispiel kennzeichnet ul oder UL einen Vorzeichenlosen Long Wert.
Verzichtet man auf ein Suffix geht der Compiler immer von einem Standard-Integerwert aus, sofern dieser passt, ansonsten verwendet er den nächst größeren Typ.
Es folgt eine Tabelle mit Beispielen, die alle denselben Wert repräsentieren:

DezimalOktalHexadezimalBinär (seit C++ 14)
ohne Suffix
Standard-Integerwert
12301730x780b1111011
unsigned / Vorzeichenlos66u0102u0x42u0b1000010u
Long Wert1234567L04553207L0x12D687L0b100101101011010000111L
unsigned long9876UL023224UL0x2694UL0b10011010010100UL
long long123987LL0362123LL0x1E453LL0b11110010001010011LL
unsigned long long123987UL0362123UL0x1E453UL0b11110010001010011UL

Character (char)

Der Datentyp char ist ein Ganzzahlentyp der kleinsten Art. Er ist dafür zuständig einzelne Buchstaben (Character) zu speichern. Intern kennt ein Computer nur Bitmuster, die als Binärzahlen interpretiert werden. Aus diesem Grund muss es eine Zuordnung in Form eines Codes. Ein Beispiel für solch einen Code ist der ASCII-Code:

ASCII-Tabelle (Quelle: https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange)

Ein anderer Code wäre der Unicode (UTF8/UTF16), die noch mehr Zeichen enthalten können. Siehe auch: https://de.wikipedia.org/wiki/Unicode).
Wenn in unserem Code also ein Zeichen wie ‚A‘ angegeben wird, wird dies vom Compiler in einen numerischen Wert übersetzt. Wir können also in unserem Code auch dezimale oder Hexadezimale Zahlenwerte angeben, die den Werten der ASCII Tabelle entsprechen. Übergeben wir einer char Variablen den Wert 65, würden wir als Ausgabe ein A erhalten. Hierzu ein kleines Code-Beispiel:

#include <iostream>
int main()
{
    char a = 'A';
    char aHex = 0x41; //ASCII-Code von A in Hexadezimaler Schreibweise
    char b = 'B';
    char c = 67; // ASCII-Code von C
    char d = 68;; // ASCII-Code von D
    std::cout << a << aHex << b << c << d << "\n";
    return EXIT_SUCCESS;
    // Ausgabe: AABCD
}

Nicht druckbare Zeichen

Neben einfachen Buchstaben gibt es auch sogenannte nicht-druckbare Zeichen in der ASCII-Tabelle. Das wichtigste ist hierbei – welches man auch bereits im obigen Beispiel sieht – das Newline-Zeichen (auch Linefeed oder LF genannt), welches kennzeichnet, dass eine neue Zeile begonnen wird. Solche Zeichen müssen an dieser mit einer Ersatzdarstellung, die immer mit einem Backslash eingeleitet wird, dargestellt wird. Eine neue Zeile wäre also \n. Es folgt eine Tabelle mit den wichtigsten nicht druckbaren Zeichen:

Steuerzeichen
\nKennzeichnet, dass eine neue Zeile begonnen wird. Der Cursor geht dabei zum Anfang der neuen Zeile.
\rStellt einen sogenannten Carriage Return (CR) dar. Der Cursor geht dabei zum Anfang der aktuellen Zeile.
\tHorizontal Tab (HT) – Stellt ein Tabulator Vorschub dar, der in der Regel vier oder acht Leerzeichen darstellt.
\“Ermöglicht, dass das Anführungszeichen “ mit ausgegeben wird. (Beispiel: „A\“\B““ ergibt A“B“
\‘Ermöglicht, dass das Hochkommata ‚ mit ausgegeben wird.
\?Gibt das Fragezeichen aus.
\\Ermöglicht die Ausgabe des Backslashes in einem String.
\0Hierbei handelt es sich um die Endmarkierung des Strings.

Es folgt ein Codebeispiel, in der einige der Steuerzeichen verwendet werden:

#include <iostream>
int main()
{
    char a = 'A';
    char b = 'B';
    char c = 'C';
    char d = 'D';
    std::cout << a << '\t' << b << '\n' << c 
                   << '\t' << '\"' << d << '\"';
    /*
       Ausgabe: 
       A       B
       C       "D"
    */
}