C ++ में लघु शाब्दिक कैसे लिखूं?


120

बहुत बुनियादी सवाल: मैं shortसी ++ में शाब्दिक कैसे लिखूं ?

मुझे निम्नलिखित पता है:

  • 2 है एक int
  • 2U है एक unsigned int
  • 2L एक है long
  • 2LL एक है long long
  • 2.0f एक है float
  • 2.0 एक है double
  • '\2'एक है char

लेकिन मैं एक shortशाब्दिक कैसे लिखूंगा ? मैंने कोशिश की 2Sलेकिन यह एक संकलक चेतावनी देता है।


10
मुझे लगता है कि लघु शाब्दिक केवल इस तथ्य के कारण समर्थित नहीं है कि मूल्यांकन के दौरान इंट से कम कुछ भी "पदोन्नत" किया जाएगा। int का सबसे प्राकृतिक आकार है। इसे C ++ में पूर्णांक पदोन्नति कहा जाता है।
user534498

जवाबों:


82
((short)2)

हाँ, यह कड़ाई से कम शाब्दिक नहीं है, एक जाति-अंतर के अधिक है, लेकिन व्यवहार समान है और मुझे लगता है कि ऐसा करने का कोई सीधा तरीका नहीं है।

यही कारण है कि मैं ऐसा कर रहा हूं क्योंकि मुझे इसके बारे में कुछ नहीं मिला। मुझे लगता है कि कंपाइलर यह संकलित करने के लिए पर्याप्त स्मार्ट होगा जैसे कि यह एक छोटा शाब्दिक है (यानी यह वास्तव में एक इंट आवंटित नहीं करेगा और फिर हर बार इसे डालेगा)।

निम्नलिखित बताता है कि आपको इस बारे में कितनी चिंता करनी चाहिए:

a = 2L;
b = 2.0;
c = (short)2;
d = '\2';

संकलन -> जुदा ->

movl    $2, _a
movl    $2, _b
movl    $2, _c
movl    $2, _d

यही कारण है कि मैं ऐसा कर रहा हूं क्योंकि मुझे इसके बारे में कुछ नहीं मिला। मुझे लगता है कि कंपाइलर यह संकलित करने के लिए पर्याप्त स्मार्ट होगा जैसे कि यह एक छोटा शाब्दिक है (यानी यह वास्तव में एक इंट आवंटित नहीं करेगा और फिर हर बार इसे डालेगा)।
किप

"कास्ट" वास्तव में कुछ भी नहीं कर रहा है। जब हम C या C ++ (.NET MSIL एक अलग कहानी है) पर बात कर रहे हैं, तो कोई "कास्ट" असेंबलर निर्देश नहीं है। धातु पर, यह सब सिर्फ द्विआधारी अंक है
Isak Savo

9
उपरोक्त, बी, सी और डी के प्रकार क्या हैं?
एतेस गोरल

2
@ ऐट्स गोरल: सभी इनट्स। संक्षिप्त या चार में परिवर्तन करने से बोर्ड में निर्देश या चलन बदल जाएगा।

2
वह कोई छोटा शाब्दिक नहीं है। जब आप उस कास्ट का उपयोग करते हैं और जीसीसी और विकल्प के साथ संकलन करते हैं, तो आप अभी भी स्टेटमेंट के लिए एक कंपाइलर डायग्नोस्टिक प्राप्त करते हैं short foo = 1; foo += (short)2;। लेकिन पूर्णांक पदोन्नति के कारण इसे दरकिनार नहीं किया जा सकता है।
हार्पर

51

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);
}

6
shortशारीरिक std::uintरूप से कुछ भी नहीं हो सकता है, क्योंकि यह एक हस्ताक्षरित प्रकार है। और यह 16 बिट्स या एक ही प्रकार के std::int16_tहोने की आवश्यकता नहीं है ... जो कि किसी दिए गए कार्यान्वयन में मौजूद होने के लिए भी आवश्यक नहीं है यदि प्लेटफ़ॉर्म सटीक-चौड़ाई प्रकार की आपूर्ति नहीं कर सकता है। इस उत्तर का मूल विचार अच्छा है, लेकिन यह ओप्लिकेबल स्पर्शरेखा द्वारा असंबंधित प्रकारों द्वारा अवमूल्यन किया गया है, जो ओपी ने इसके बारे में पूछा है।
अंडरस्कोर_ड

ध्यान दें कि उपयोगकर्ता-परिभाषित शाब्दिक विज़ुअल स्टूडियो में VS2015 तक समर्थित नहीं हैं: msdn.microsoft.com/en-us/library/hh567368(v=vs.140).aspx
parsley72

मुझे नहीं पता कि मुझे उससे प्यार करना चाहिए या उससे घृणा करनी चाहिए, लेकिन C ++ में मेरे वास्तव में मजबूत पूर्णांक प्रकार की प्रणाली के लिए यह अंतिम टुकड़ा है जिस पर मैं काम कर रहा हूं, यह आश्चर्यजनक है।
साहसाहे

@underscore_d को गूँजते हुए, मैं अपवोट करूंगा लेकिन shortओपी के द्वारा संपादित किए जाने के बाद ।
v.oddou

28

यहां तक ​​कि 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."
*/

18

यदि आप 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 पर इन प्रत्ययों पर कोई जानकारी भी नहीं ढूँढ सका।


1
जब आप किसी प्रत्यय का पता लगाते हैं, तो आप देखेंगे कि उदाहरण ""ui8के रूप में परिभाषित किया गया है '\000', जो अनिवार्य रूप से है '\0'
निकिता

10

आप छद्म कंस्ट्रक्टर सिंटैक्स का भी उपयोग कर सकते हैं।

short(2)

मुझे यह कास्टिंग की तुलना में अधिक पठनीय लगता है।


4
इसे "कार्यात्मक कास्ट एक्सप्रेशन" कहा जाता है। मुझे यह बहुत पसंद है और साथ ही, विशेष रूप से विंडोज एपीआई के साथ प्रोग्रामिंग करते समय।
klaus triendl

6

जहाँ तक मुझे पता है, तुम नहीं, ऐसा कोई प्रत्यय नहीं है। अधिकांश कंपाइलर चेतावनी देंगे कि यदि कोई वैरिएबल शाब्दिक है, तो आप इसे जिस भी वैरिएबल में रखने की कोशिश कर रहे हैं, उसमें फिट होना बहुत बड़ी बात है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.