Этот индикатор, на который вы ссылаетесь, называется суффиксом .
Для целочисленных типов существует два типа суффиксов:
- беззнаковый суффикс - символ
u
или символ U
- длинный суффикс - символ
l
или символ L
или длинный-длинный суффикс - последовательность символов ll
или последовательность символов LL
.
Для целочисленных литералов вы можете комбинировать эти суффиксы, такие как ul
или ull
, чтобы получить и "unsignednes" и "longness" в одном и том же литерале.
Существуют также суффиксы для типов с плавающей запятой: один из f
, F
, l
или L
- Без суффикса литерал определяет
double
f
или F
определяет float
l
или L
определяет long double
Существуют также пользовательские литералы, для которых вы можете ввести пользовательские суффиксы.
Что касается вашего второго вопроса о unsigned short
: явного суффикса для short
не существует, поэтому вам придется использовать static_cast
или приведение в стиле C.
Другой способ сделать это - определить пользовательский литеральный оператор , например,
unsigned short operator "" _ush(unsigned long long int a)
{
return static_cast<unsigned short>(a);
}
А затем используйте его для определения литералов следующим образом: unsigned short a = 123_ush;
Я проверил, что это работает, используя этот фрагмент:
#include <iostream>
#include <string>
#include <typeinfo>
unsigned short operator "" _ush(unsigned long long int a)
{
return static_cast<unsigned short>(a);
}
int main()
{
std::string name;
bool equal = typeid(decltype(123_ush)) == typeid(unsigned short); // check that literal is indeed unsigned short
std::cout << equal;
}
Для получения дополнительной информации о вещах, упомянутых в моем ответе, я бы предложил проверить cppreference: Целочисленные литералы , Литерал с плавающей точкой , Пользовательский литерал