Что означает ЛЛ?

Определен ли LL где-нибудь в стандарте (сложный термин)?

ideone принимает код

int main()
{
    std::cout << sizeof(0LL) << std::endl;
    std::cout << sizeof(0);
}

и печатает

8
4

Но что это значит?


person Luchian Grigore    schedule 22.03.2013    source источник


Ответы (4)


Это указано в параграфе 2.14.2 стандарта C++11:

2.14.2 Целочисленные литералы

[...]

длинный-длинный-суффикс: один из

ll LL

В параграфе 2.14.2/2 и, в частности, в таблице 6 уточняется значение суффикса для десятичных, восьмеричных и шестнадцатеричных констант, а также типов, которые им присваиваются.

Поскольку 0 — восьмеричный литерал, тип 0LLlong long int:

#include <type_traits>

int main()
{
    // Won't fire
    static_assert(std::is_same<decltype(0LL), long long int>::value, "Ouch!");
}
person Andy Prowl    schedule 22.03.2013

LL - это суффикс для long-long, который является 64-битным в большинстве (всех?) реализаций C/C++. Итак, 0LL — это 64-битный литерал со значением 0.

Это похоже на суффикс L для длинного литерала, который в большинстве 32- и 64-битных реализаций C/C++ имеет тот же размер, что и недлинный int. (В 16-разрядных реализациях размер int обычно составляет 16 бит, поэтому суффикс L указывает на 32-разрядный целочисленный литерал, в отличие от 16-разрядного значения по умолчанию.)

person cdhowie    schedule 22.03.2013

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
...
person Joseph Mansfield    schedule 22.03.2013
comment
Когда восьмеричные и шестнадцатеричные литералы становятся беззнаковыми, если это необходимо, за исключением случаев использования другого суффикса, который здесь не упоминается? - person unwind; 22.03.2013
comment
@unwind Когда значение не помещается в long long int, но помещается в unsigned long long int. Это считается только в том случае, если оно не помещается внутри long long int. - person Joseph Mansfield; 22.03.2013
comment
@unwind Когда они не вписываются в подписанный тип. Скажем, целые 16-битные. 0x7fff вписывается в int. 0x8000 не подходит для int, но подходит для unsigned int. - person Alexey Frunze; 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 в конце целочисленной константы.

person João Víctor Melo    schedule 30.07.2021