Как написать короткий литерал на С++?
Очень простой вопрос: как написать литерал short
в С++?
Я знаю следующее:
-
2
является int
-
2U
- это unsigned int
-
2L
является long
-
2LL
- это long long
-
2.0f
- это float
-
2.0
является double
-
'\2'
является char
.
Но как бы написать литерал short
? Я пробовал 2S
, но это дает предупреждение компилятора.
Ответы
Ответ 1
((short)2)
Да, это не строго короткий литерал, а больше casted-int, но поведение такое же, и я думаю, что нет прямого способа сделать это.
Это то, что я делал, потому что я ничего не мог найти об этом. Я бы предположил, что компилятор будет достаточно умным, чтобы скомпилировать его так, как если бы он был коротким литералом (т.е. Он фактически не выделял бы int, а затем бросал бы его каждый раз).
Ниже показано, как вы должны беспокоиться об этом:
a = 2L;
b = 2.0;
c = (short)2;
d = '\2';
Скомпилировать → разобрать →
movl $2, _a
movl $2, _b
movl $2, _c
movl $2, _d
Ответ 2
С++ 11 дает вам довольно близкое к тому, что вы хотите. (Найдите "пользовательские литералы", чтобы узнать больше.)
#include <cstdint>
inline std::uint16_t operator "" _u(unsigned long long value)
{
return static_cast<std::uint16_t>(value);
}
void func(std::uint32_t value); // 1
void func(std::uint16_t value); // 2
func(0x1234U); // calls 1
func(0x1234_u); // calls 2
// also
inline std::int16_t operator "" _s(unsigned long long value)
{
return static_cast<std::int16_t>(value);
}
Ответ 3
Даже писатели стандарта C99 получили это. Это фрагмент из общедоступного домена Danny Smith stdint.h
:
/* 7.18.4.1 Macros for minimum-width integer constants
Accoding to Douglas Gwyn <[email protected]>:
"This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC
9899:1999 as initially published, the expansion was required
to be an integer constant of precisely matching type, which
is impossible to accomplish for the shorter types on most
platforms, because C99 provides no standard way to designate
an integer constant with width less than that of type int.
TC1 changed this to require just an integer constant
*expression* with *promoted* type."
*/
Ответ 4
Если вы используете Microsoft Visual C++, для каждого целочисленного типа доступны буквенные суффиксы:
auto var1 = 10i8; // char
auto var2 = 10ui8; // unsigned char
auto var3 = 10i16; // short
auto var4 = 10ui16; // unsigned short
auto var5 = 10i32; // int
auto var6 = 10ui32; // unsigned int
auto var7 = 10i64; // long long
auto var8 = 10ui64; // unsigned long long
Обратите внимание, что это нестандартное расширение и не являются переносимыми. На самом деле, я даже не смог найти информацию об этих суффиксах в MSDN.
Ответ 5
Вы также можете использовать синтаксис псевдоконструктора.
short(2)
Я нахожу его более читаемым, чем кастинг.
Ответ 6
Насколько я знаю, вы этого не делаете, нет такого суффикса. Большинство компиляторов будут предупреждать, если целочисленный литерал слишком велик, чтобы соответствовать любой переменной, которую вы пытаетесь сохранить в ней.