2009-08-25 17 views
35

42 जैसा कि हस्ताक्षरित int को "42U" के रूप में अच्छी तरह से परिभाषित किया गया है।एक हस्ताक्षरित लघु int अक्षर कैसे लिखें?

unsigned int foo = 42U; // yeah! 

मैं "23" कैसे लिख सकते हैं ताकि यह स्पष्ट है, यह एक अहस्ताक्षरित लघु पूर्णांक है?

unsigned short bar = 23; // booh! not clear! 

संपादित करें ताकि प्रश्न के अर्थ अधिक स्पष्ट है:

template <class T> 
void doSomething(T) { 
    std::cout << "unknown type" << std::endl; 
} 

template<> 
void doSomething(unsigned int) { 
    std::cout << "unsigned int" << std::endl; 
} 

template<> 
void doSomething(unsigned short) { 
    std::cout << "unsigned short" << std::endl; 
} 

int main(int argc, char* argv[]) 
{ 
    doSomething(42U); 
    doSomething((unsigned short)23); // no other option than a cast? 

    return EXIT_SUCCESS; 
} 
+2

घोषित हिस्सा है पर पता नहीं है एक ' एक उचित नाम के साथ बिना हस्ताक्षरित शॉर्ट 'ऑब्जेक्ट का गठन करें और उसके बाद 23 के स्थान पर इसका उपयोग करें। यह अभी भी स्पष्ट रूप से यह बताने में आपकी सहायता नहीं करता है कि 23 को असाइन किया जाना छोटा है, लेकिन कम से कम आपको केवल यह सुनिश्चित करने की आवश्यकता है कि शुद्धता सुनिश्चित करें । हर जगह निरंतर उपयोग करेगा और इसलिए अर्थ स्पष्ट होगा। –

+0

@ रिचर्ड कॉर्डन: यह इनपुट मानों के रूप में सैकड़ों बार उपयोग और यूनिट परीक्षणों में परिणाम के लिए उपयोग किया जाता है, इसलिए छोटा, बेहतर ... बिना हस्ताक्षर किए गए int के लिए यू सुविधाजनक है, लेकिन (हस्ताक्षरित छोटा) कास्ट करता है या बिना हस्ताक्षरित छोटी वस्तुओं को उत्तेजित करता है । – moala

+0

आप पूछ रहे हैं कि एक हस्ताक्षरित लघु शाब्दिक घोषित कैसे करें। यदि आप उस प्रश्न की तलाश करेंगे तो आपको अपना जवाब मिल जाएगा। जैसा कि कहा गया है कि आप नहीं कर सकते हैं। –

उत्तर

32

आप नहीं कर सकते। संख्यात्मक अक्षर में short या unsigned short प्रकार नहीं हो सकता है।

बेशक bar को असाइन करने के लिए, शाब्दिक का मूल्य स्पष्ट रूप से unsigned short में परिवर्तित हो गया है। आपके पहले नमूना कोड में, आप उस रूपांतरण को कलाकार के साथ स्पष्ट कर सकते हैं, लेकिन मुझे लगता है कि यह पहले से ही स्पष्ट है कि रूपांतरण क्या होगा। कास्टिंग संभावित रूप से खराब है, क्योंकि कुछ कंपाइलरों के साथ यह किसी भी चेतावनी को रद्द कर देगा जो जारी किया जाएगा यदि शाब्दिक मान unsigned short की सीमा से बाहर है। फिर फिर, यदि एक अच्छे कारण के लिए इस तरह के मूल्य का उपयोग करने के लिए चाहते हैं, तो चेतावनियों को रद्द करना अच्छा है।

आपके संपादन में उदाहरण में, जहां ओवरलोडेड फ़ंक्शन के बजाय टेम्पलेट फ़ंक्शन होता है, तो आपके पास कास्ट का विकल्प होता है: do_something<unsigned short>(23)। एक ओवरलोड समारोह के साथ, आप अभी भी साथ एक डाली से बच सकते हैं:

void (*f)(unsigned short) = &do_something; 
f(23); 

... लेकिन मैं यह सलाह देने के लिए नहीं है। यदि कुछ और नहीं है, तो यह केवल तभी काम करता है जब unsigned short संस्करण वास्तव में मौजूद है, जबकि कलाकार के साथ एक कॉल सामान्य अनुकूल लोड रिज़ॉल्यूशन को सबसे संगत संस्करण उपलब्ध कराने के लिए करता है।

0

दुर्भाग्य से, केवल विधि इस के लिए परिभाषित

एक या एकल उद्धरण (') में दो वर्ण, पत्र एल

से पहले http://cpp.comsci.us/etymology/literals.html

के अनुसार है कौन सा इसका मतलब है कि आपको एएससीआईआई एस्केप अनुक्रम के रूप में अपना नंबर प्रस्तुत करना होगा:

unsigned short bar = L'\x17'; 
+5

आपके शाब्दिक प्रकार के पास 'wchar_t' होगा। आपके द्वारा उद्धृत स्रोत गलत है। – avakar

+0

सुधार के लिए धन्यवाद। अगर मैं उस लिंक से किसी और को गुमराह करता हूं (जो इस प्रश्न के लिए एक स्पष्ट Google खोज पर आता है), तो मैं इस जवाब को छोड़ दूंगा। –

+1

एएससीआईआई मानते हुए इसे और अधिक समस्याएं मिली हैं। 'ए' हमेशा 65 नहीं होता है। – MSalters

0

दुर्भाग्यवश, वे नहीं कर सकते हैं। लेकिन अगर लोग संख्या के पीछे दो शब्द देखते हैं, तो उन्हें स्पष्ट रूप से देखना चाहिए कि यह एक छोटा सा है ... यह अस्पष्ट नहीं है। लेकिन यह अच्छा होगा।

+0

यह संदिग्ध है यदि कोई विधि बिना हस्ताक्षर किए गए int और हस्ताक्षरित शॉर्ट के लिए अलग-अलग व्यवहार करती है और यदि आप इसे थिंग्स (42 यू) के रूप में पास करते हैं; DoThings के अलावा किसी भी तरह ((हस्ताक्षरित छोटा) 23)? – moala

0

यदि आप मात्रा को 4-अंकों वाले हेक्स नंबर के रूप में व्यक्त करते हैं, तो हस्ताक्षरित शॉर्टनेस स्पष्ट हो सकती है।

unsigned short bar = 0x0017;

+2

0x0017 एक हस्ताक्षरित शॉर्ट के रूप में पाठक के लिए स्पष्ट हो सकता है, लेकिन संकलक के लिए नहीं। – moala

8
unsigned short bar = (unsigned short) 23; 

या नई बात में ....

unsigned short bar = static_cast<unsigned short>(23); 
+2

सी में यह करना सही होगा, लेकिन आईआईआरसी सी-शैली कास्ट सी ++ में फंस गया है। – starblue

+3

पर फंसे! हो सकता है कि मैंने आपको खुश रखने के लिए इसे अद्यतित संस्करण के साथ संशोधित किया हो! – AnthonyLambert

1

अहस्ताक्षरित कम के लिए कोई संशोधक हैं।इंटीग्रर्स, जिसमें int डिफ़ॉल्ट रूप से टाइप होता है, आमतौर पर बिना किसी समस्या के लक्षित लक्ष्य प्रकार में परिवर्तित हो जाता है। लेकिन अगर आप वास्तव में करने के लिए स्पष्ट रूप से संकेत मिलता है प्रकार चाहते हैं, आप लिख सकते हैं निम्नलिखित:

unsigned short bar = static_cast<unsigned short>(23); 

मैं देख सकते हैं एकमात्र कारण उचित बात का अनुमान लगाना टेम्पलेट प्रकार के लिए इस तरह के संकेत का उपयोग करने के लिए है:

func(static_cast<unsigned short>(23)); 

लेकिन के लिए इस तरह के मामले को अधिक स्पष्ट रूप से कॉल किया जाएगा:

func<unsigned short>(23); 
0

आपको शायद कम से कम उपयोग नहीं करना चाहिए, जब तक कि आप उनमें से बहुत कुछ न लें। यह एक int की तुलना में कम भंडारण का उपयोग करना है, लेकिन उस int के आर्किटेक्चर के लिए "प्राकृतिक आकार" होगा। तर्कसंगत यह है कि एक छोटा सा शायद नहीं करता है। बिटफील्ड के समान, इसका मतलब है कि शॉर्ट्स को स्पेस/टाइम ट्रेडऑफ माना जा सकता है। यह आमतौर पर केवल इसके लायक है अगर यह आपको पूरी जगह खरीदता है। आपके आवेदन में बहुत सारे अक्षर होने की संभावना नहीं है, हालांकि, लघु अक्षर रखने की कोई आवश्यकता नहीं थी। उपयोगकेस बस ओवरलैप नहीं किया था।

2

कम से कम दृश्य स्टूडियो (कम से कम 2013 और नए) में आप

23ui16 

लिख सकते हैं के लिए प्रकार अहस्ताक्षरित कम की एक निरंतर मिलता है।

stdint.h में INT8_MIN, INT8_MAX, INT16_MIN, INT16_MAX, आदि मैक्रो की परिभाषाएं देख

मैं इस पल है कि क्या यह की मानक C/C++

संबंधित मुद्दे