В книге "C ++ Primer" говорится, что десятичные литералы имеют наименьший тип int
, long
или long long
, которому соответствует значение литерала, и использование литерала, который являетсяслишком большой, чтобы поместиться в самый большой связанный тип.Итак, я предполагаю, что максимальный десятичный литерал - это максимальное значение, которое может содержать long long
.Но я попробовал: напечатал значение max long long
, затем десятичный литерал выше.Я думал, что это должно было вызвать ошибку, но это было хорошо.Затем я попытался напечатать десятичный литерал выше значения unsigned long long
max - оно обернулось вокруг.
Вот мой код:
#include <iostream>
#include <limits>
using namespace std;
int main() {
cout << LONG_LONG_MAX << endl;
cout << 9223372036854775808 << endl;
cout << ULONG_LONG_MAX << endl;
cout << 18446744073709551616 << endl;
}
Вот результат:
9223372036854775807
9223372036854775808
18446744073709551615
0
Объясните, пожалуйста, почему десятичный литерал может быть выше, чем long long
максимальное значение
UPD :
Я заметил, что на самом деле были предупреждения.Я работаю в CodeBlocks, и при перестройке и повторном запуске вашего проекта он не выводит предупреждения снова, если код не изменен.Так что я просто не заметил.Было 3 предупреждения:
integer constant is so large that it is unsigned (8)
this decimal constant is unsigned only in ISO C90 (8)
integer constant is too large for its type (10)
Но вывод был тот же.Затем я заметил, что в опциях отладчика я забыл заполнить строку 'путь к исполняемому файлу', поэтому вставил туда свой путь к GDB.Но я не думаю, что это имело значение.Впоследствии я заметил, что в настройках компилятора я не выбрал опцию «иметь g ++ follow c ++ 11».Я выбрал компилятор, а затем напечатал как предупреждения, так и некоторые ошибки.Не было предупреждения this decimal constant is unsigned only in ISO C90
, но была ошибка ..\main.cpp|8|error: ambiguous overload for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and '<unnamed-signed:128>')|
.Также он не распознал limits
с LONG_LONG_MAX и ULONG_LONG_MAX, но распознал climits
с LLONG_MAX и ULLONG_MAX.С c ++ 98 были предупреждения, как в первом случае (без выбранной опции), и он не распознавал limits
, только climits
.Когда я изменил имя заголовка, вывод был как в начале.Компилятор настроен на GNU GCC Compiler.
Может быть, кто-то может объяснить, почему компилятор поддерживает limits
, если я не задаю стандарт, и тогда, я думаю, вопрос закрыт.