долго-долго в C / C++


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

#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 79

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;

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