Как написать короткий литерал в C++?
очень простой вопрос: как мне написать short
литерала в C++?
я знаю следующее:
-
2
этоint
-
2U
- этоunsigned int
-
2L
этоlong
-
2LL
этоlong long
-
2.0f
этоfloat
-
2.0
этоdouble
-
''
этоchar
.
но как бы я пишу short
буквально? Я пытался 2S
но это дает предупреждение компилятора.
6 ответов:
((short)2)
Да, это не совсем короткий литерал, больше похожий на casted-int, но поведение такое же, и я думаю, что нет прямого способа сделать это.
Это то, что я делал, потому что я ничего не мог найти об этом. Я бы предположил, что компилятор будет достаточно умен, чтобы скомпилировать это, как если бы это был короткий литерал (т. е. он фактически не выделял бы int, а затем каждый раз бросал его).
ниже показано, сколько вы следует беспокоиться об этом:
a = 2L; b = 2.0; c = (short)2; d = '';
Compile - > disassemble ->
movl , _a movl , _b movl , _c movl , _d
в C++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); }
даже авторы стандарта C99 были пойманы этим. Это фрагмент из общественного достояния Дэнни Смита
stdint.h
реализация:/* 7.18.4.1 Macros for minimum-width integer constants Accoding to Douglas Gwyn <gwyn@arl.mil>: "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." */
Если вы используете 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.