سؤال
سؤال أساسي جداً:كيف أكتب أ short
الحرفي في C++؟
أعرف ما يلي:
2
هوint
2U
هوunsigned int
2L
هوlong
2LL
هوlong long
2.0f
هوfloat
2.0
هوdouble
'\2'
هوchar
.
ولكن كيف أكتب أ short
حرفي؟حاولت 2S
ولكن هذا يعطي تحذيرا للمترجم.
المحلول
((short)2)
نعم، إنه ليس حرفيًا قصيرًا تمامًا، بل هو أكثر من مجرد حرف مصبوب، لكن السلوك هو نفسه وأعتقد أنه لا توجد طريقة مباشرة للقيام بذلك.
هذا ما كنت أفعله لأنني لم أتمكن من العثور على أي شيء عنه.أعتقد أن المترجم سيكون ذكيًا بما يكفي لتجميع هذا كما لو كان حرفيًا قصيرًا (أي.لن يقوم في الواقع بتخصيص int ثم إرساله في كل مرة).
يوضح ما يلي مدى القلق الذي يجب أن تقلق بشأنه:
a = 2L;
b = 2.0;
c = (short)2;
d = '\2';
تجميع -> تفكيك ->
movl $2, _a
movl $2, _b
movl $2, _c
movl $2, _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.
يمكنك أيضًا استخدام بناء جملة المنشئ الزائف.
short(2)
أجد أنه أكثر قابلية للقراءة من الصب.
بقدر ما أعرف، لا يوجد مثل هذه اللاحقة.سيحذرك معظم المترجمين إذا كان عدد صحيح كبير جدًا بحيث لا يتناسب مع أي متغير تحاول تخزينه فيه.