Я пробую этот код на компиляторе 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.
Почему?
c++
types
long-integer
Sud03r
источник
источник
<stdint.h>
и использоватьuint64_t
. Чтобы отобразить 64 битное значение,printf( "%" PRIu64 "\n", val);
<stdint.h>
включен,uint64_t a = 0xffffffffffffff; printf( "%" PRIu64 "\n",a ); : error: expected ‘)’ before ‘PRIu64’ printf( "%" PRIu64 "\n",a ); :: warning: spurious trailing ‘%’ in format [-Wformat=] printf( "%" PRIu64 "\n",a );
#define __STDC_FORMAT_MACROS 1
См stackoverflow.com/questions/14535556/...Ответы:
Буквы 100000000000 составляют буквальную целочисленную константу, но значение слишком велико для данного типа
int
. Вам нужно использовать суффикс, чтобы изменить тип литерала, т.е.long long num3 = 100000000000LL;
Суффикс
LL
превращает литерал в типlong long
. C недостаточно "умен", чтобы сделать вывод из типа слева, тип - это свойство самого литерала, а не контекст, в котором он используется.источник
int
,long int
иlong long int
в котором его значение может быть представлено. [C ++ §2.14.2 / 2] Поэтому теперь нет необходимости добавлять суффикс 'LL' к целочисленному литералу, который слишком велик для других типов.Пытаться:
num3 = 100000000000LL;
И, кстати, в C ++ это расширение компилятора, стандарт не определяет long long, это часть C99.
источник
Это зависит от того, в каком режиме вы компилируете. long long не является частью стандарта C ++, а поддерживается (обычно) только как расширение. Это влияет на тип литералов. Десятичные целочисленные литералы без суффикса всегда относятся к типу int, если int достаточно велик для представления числа, в противном случае - long. Если число даже слишком велико в течение длительного времени, результат определяется реализацией (вероятно, это просто число типа long int, которое было усечено для обратной совместимости). В этом случае вы должны явно использовать суффикс LL, чтобы включить long long расширение (в большинстве компиляторов).
Следующая версия C ++ будет официально поддерживать long long, так что вам не понадобится суффикс, если только вы явно не хотите, чтобы тип литерала был как минимум long long. Если число не может быть представлено длинным, компилятор автоматически попытается использовать long long даже без суффикса LL. Я считаю, что это тоже поведение C99.
источник
ваш код компилируется здесь нормально (даже с этой строкой без комментариев. пришлось изменить ее на
num3 = 100000000000000000000;
чтобы начать получать предупреждение.
источник
long
в соответствии с LP64 ABI этой ОС.