Вопрос

Я пробую этот код в компиляторе 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;
}

Когда я раскомментирую прокомментированную строку, код не компилируется и выдает ошибку:

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

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

Почему?

Это было полезно?

Решение

Буквы 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, чтобы включить расширение long long (в большинстве компиляторов).

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

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

num3 = 100000000000000000000;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top