स्टार्टर्स के लिए, आपके द्वारा दिया गया कोड भी संकलित नहीं होगा, क्योंकि int
से छोटे आकार वाले सभी पूर्णांक गणित int
के साथ किए जाते हैं। तो a + b
का परिणाम int
है, और int
स्पष्ट रूप से ubyte
में परिवर्तित नहीं होगा, क्योंकि यह एक संकुचित रूपांतरण है। यदि आप इसे c
पर असाइन करना चाहते हैं, तो आपको इसे डालना होगा।
ubyte c = cast(ubyte)(a + b);
अब, यह स्पष्ट रूप से एक अनियंत्रित रूपांतरण है, और यह खुशी से c
में 44
सामान पाएंगे (क्योंकि कि 100
और 200
के मूल्यों को देखते हुए कलाकारों का परिणाम है)। एक ConvOverflowException
, (जो ConvException
का एक उपवर्ग है), क्योंकि परिणाम का अनुरोध प्रकार में फिट नहीं हो
ubyte c = to!ubyte(a + b);
फेंक देते हैं कि: यदि आप एक जाँच की रूपांतरण चाहते हैं, तो std.conv.to
का उपयोग करें।
यदि आप खुद को कास्ट करना चाहते हैं और फिर जांच करें कि ओवरफ्लो था, तो आप अनिवार्य रूप से सी/सी ++ के समान नाव में हैं, और इस तरह के कोई भी झंडे या कुछ भी नहीं हैं। हो सकता है कि अगर आप असेंबली कोड से जांचें तो उस तरह की चीज मौजूद है। मुझे नहीं पता। लेकिन भाषा निश्चित रूप से ऐसा कुछ भी प्रदान नहीं करती है। std.conv.to
परिणाम की जांच करके यह देखता है कि यह बहुत बड़ा या बहुत छोटा है (तर्क के संकेत और प्रकार के आधार पर)।
स्रोत
2012-11-25 04:13:30
सी ++ http: //stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc –
और असेंबली http://stackoverflow.com/ के लिए एक ही प्रश्न देखें प्रश्न/3 9 25528/x86-assembly-inc-and-dec-instruct-and-overflow-flag –