long long in C / C ++

Ich versuche diesen Code auf dem C ++ - Compiler von GNU und kann sein Verhalten nicht verstehen:

#include <stdio.h>;

int main()
{
    int  num1 = 1000000000;
    long num2 = 1000000000;
    long long num3;
    //num3 = 100000000000;
    long long num4 = ~0;

    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
    printf("%d %ld %lld %llu", num1, num2, num3, num4);
    return 0;
}

Wenn ich die kommentierte Zeile auskommentiere, wird der Code nicht kompiliert und es wird ein Fehler ausgegeben:

Fehler: Ganzzahlkonstante ist zu groß für langen Typ

Wenn der Code jedoch so kompiliert und ausgeführt wird, werden Werte erzeugt, die viel größer als 10000000000 sind.

Warum?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage