2013-10-11 11 views
10

जैसा कि http://ideone.com/RdINqa में दिखाया गया है, std::stoul नकारात्मक संख्याओं के लिए std::out_of_range नहीं फेंकता है, लेकिन उन्हें चारों ओर लपेटता है। ऐसा क्यों है? ऐसा लगता है कि -4 unsigned long प्रकार की सीमा से बाहर है इसलिए इसे फेंकना चाहिए।std :: stoul नकारात्मक संख्याओं को क्यों परिवर्तित करता है?

उत्तर

10

21,5 संख्यात्मक रूपांतरण

unsigned long stoul(const string& str, size_t *idx = 0, int base = 10);

प्रभाव: ... फोन [एस] strtoul(str.c_str(), ptr, base) ... रिटर्न परिवर्तित परिणाम, यदि कोई हो।

फेंकता है: ... out_of_range यदि परिवर्तित मूल्य वापसी प्रकार के लिए प्रतिनिधित्व मूल्यों की सीमा से बाहर है।

"रूपांतरित मूल्य" यहां strtoul द्वारा दिया गया मान है। जो, ज़ाहिर है, unsigned long प्रकार है और इसलिए stoul के रिटर्न प्रकार के लिए प्रतिनिधित्व मूल्यों की सीमा के बाहर नहीं हो सकता है, जो unsigned long भी है।

जहां तक ​​मेरा बता सकते हैं, केवल stoiout_of_range, क्योंकि यह int रिटर्न लेकिन strtol जो long रिटर्न का उपयोग करता फेंक कर सकते हैं।

इसके अलावा, जिस तरह से सी मानक strtoul निर्दिष्ट करता है, यह स्ट्रिंग "-4" स्वीकार करते हैं और -(unsigned long)4 के बराबर एक मूल्य के वापस जाने के लिए आवश्यक है। यह इस तरह से क्यों निर्दिष्ट है, मुझे नहीं पता।

+3

धन्यवाद, यह कष्टप्रद है – Kal

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