long long в C / C++

Я пробую этот код на компиляторе C++ GNU и не могу понять его поведение:

#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;
}

когда я раскомментировать закомментированный код не компилируется и дает ошибку:

ошибка: целая константа слишком велика для типа long

но, если код скомпилирован как есть и выполняется, он производит значения намного больше, чем 10000000000.

почему?

4 ответов


буквы 100000000000 составляют литеральную целочисленную константу, но значение слишком велико для типа int. Вам нужно использовать суффикс для изменения типа литерала, т. е.

long long num3 = 100000000000LL;

суффикс LL делает литерал типа long long. C недостаточно "умен", чтобы заключить это из типа слева, тип является свойством самого литерала, а не контекста, в котором он используется.


попробуй:

num3 = 100000000000LL;

и кстати, в C++ это расширение компилятора, стандарт не определяет long long, это часть C99.


Это зависит от того, в каком режиме компиляции. long long не является частью стандарта C++, а только (обычно) поддерживается как расширение. Это влияет на тип литералов. Десятичные целочисленные литералы без суффиксов всегда имеют тип int если int достаточно большой чтобы представить число, длинное в противном случае. Если число даже слишком велико для long, результат определяется реализацией (возможно, просто число типа long int, которое было усечено для обратной совместимости). В этом если вам нужно явно использовать суффикс LL для включения длинного длинного расширения (в большинстве компиляторов).

следующая версия C++ будет официально поддерживать long long таким образом, что вам не понадобится суффикс, если вы явно не хотите, чтобы тип литерала был по крайней мере длинным. Если число не может быть представлено в long, компилятор автоматически попытается использовать long long даже без суффикса LL. Я считаю, что это поведение C99.


ваш код компилируется нормально (даже при том, что строки раскомментированы. пришлось изменить его на

num3 = 100000000000000000000;

начать получать предупреждение.