سؤال

سؤال أساسي جداً:كيف أكتب أ 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)

أجد أنه أكثر قابلية للقراءة من الصب.

بقدر ما أعرف، لا يوجد مثل هذه اللاحقة.سيحذرك معظم المترجمين إذا كان عدد صحيح كبير جدًا بحيث لا يتناسب مع أي متغير تحاول تخزينه فيه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top