Определен ли LL
где-нибудь в стандарте (сложный термин)?
ideone принимает код
int main()
{
std::cout << sizeof(0LL) << std::endl;
std::cout << sizeof(0);
}
и печатает
8
4
Но что это значит?
Определен ли LL
где-нибудь в стандарте (сложный термин)?
ideone принимает код
int main()
{
std::cout << sizeof(0LL) << std::endl;
std::cout << sizeof(0);
}
и печатает
8
4
Но что это значит?
Это указано в параграфе 2.14.2 стандарта C++11:
[...]
длинный-длинный-суффикс: один из
ll LL
В параграфе 2.14.2/2 и, в частности, в таблице 6 уточняется значение суффикса для десятичных, восьмеричных и шестнадцатеричных констант, а также типов, которые им присваиваются.
Поскольку 0
— восьмеричный литерал, тип 0LL
— long long int
:
#include <type_traits>
int main()
{
// Won't fire
static_assert(std::is_same<decltype(0LL), long long int>::value, "Ouch!");
}
LL
- это суффикс для long-long, который является 64-битным в большинстве (всех?) реализаций C/C++. Итак, 0LL
— это 64-битный литерал со значением 0.
Это похоже на суффикс L
для длинного литерала, который в большинстве 32- и 64-битных реализаций C/C++ имеет тот же размер, что и недлинный int
. (В 16-разрядных реализациях размер int
обычно составляет 16 бит, поэтому суффикс L
указывает на 32-разрядный целочисленный литерал, в отличие от 16-разрядного значения по умолчанию.)
0LL
— целочисленный литерал. Его суффикс LL
определяет возможный набор типов, которые он может иметь. Для десятичной константы тип будет long long int
. Для восьмеричной или шестнадцатеричной константы тип будет long long int
или unsigned long long int
, если это необходимо. В случае 0LL
литерал имеет тип long long int
.
Тип целочисленного литерала является первым из соответствующего списка в таблице 6, в котором может быть представлено его значение.
Таблица 6 – Типы целочисленных констант
Suffix Decimal constants Octal or hexadecimal constant ... ll or LL long long int long long int unsigned long long int ...
long long int
, но помещается в unsigned long long int
. Это считается только в том случае, если оно не помещается внутри long long int
.
- person Joseph Mansfield; 22.03.2013
Мы начнем с примера:
std::cout ‹‹ 2LL ‹‹ endl;
Этот результат будет равен 2, и это происходит, потому что в зависимости от размера данных и для его правильного исправления мы хотим в некоторых ситуациях использовать 2 как long, и это именно то, что происходит. Вывод имеет тип long long, представляющий константу int 2.
unsigned int: символ u или U в конце целочисленной константы.
long int: символ l или L в конце целочисленной константы.
unsigned long int: символ ul или UL в конце целочисленной константы.
long long int: символ ll или LL в конце целочисленной константы. unsigned long long int: символ ull или ULL в конце целочисленной константы.