Очень простой вопрос: как мне написать short
литерал на C ++?
Знаю следующее:
2
являетсяint
2U
являетсяunsigned int
2L
этоlong
2LL
этоlong long
2.0f
этоfloat
2.0
этоdouble
'\2'
это аchar
.
Но как мне написать short
буквальное? Я пробовал, 2S
но это дает предупреждение компилятору.
Ответы:
Да, это не совсем короткий литерал, скорее это приведенный int, но поведение такое же, и я думаю, что нет прямого способа сделать это.
Следующее показывает, насколько вам следует об этом беспокоиться:
Скомпилировать -> разобрать ->
источник
short foo = 1; foo += (short)2;
. Но этого не избежать из-за целочисленной промо-акции.C ++ 11 дает вам довольно близко к тому, что вы хотите. (Чтобы узнать больше, выполните поиск по запросу "определяемые пользователем литералы".)
источник
short
физически не может бытьstd::uint
ничем, так как это знаковый тип. И это не обязательно должны быть либо 16 бит или же типа какstd::int16_t
... которая сама по себе даже не требуется , чтобы существовать в данной реализации , если платформа не может поставить точный тип ширины. Основная идея этого ответа хороша, но она обесценивается необъяснимым касанием к несвязанным типам, о которых OP не спрашивал.short
ответил OP.Это застало даже разработчиков стандарта C99. Это отрывок из реализации Дэнни Смита в общественном достоянии
stdint.h
:источник
Если вы используете Microsoft Visual C ++, для каждого целочисленного типа доступны буквальные суффиксы:
Обратите внимание, что это нестандартное расширение и его нельзя переносить . Фактически, я даже не смог найти никакой информации об этих суффиксах на MSDN.
источник
""ui8
определяется как'\000'
, что по сути является'\0'
.Вы также можете использовать синтаксис псевдоконструктора.
Я считаю это более читаемым, чем кастинг.
источник
Насколько я знаю, нет, такого суффикса нет. Однако большинство компиляторов предупреждают, если целочисленный литерал слишком велик, чтобы поместиться в любую переменную, в которой вы пытаетесь его сохранить.
источник