एक ठेठ निरपेक्ष मूल्य समारोह पर विचार करें (जहां तर्क की खातिर अधिकतम आकार का अभिन्न प्रकार लंबा है):क्या अतिप्रवाह ट्रिगर किए बिना हस्ताक्षरित पूर्णांक के हस्ताक्षरित पूर्ण मूल्य प्राप्त करने का कोई सुरक्षित तरीका है?
unsigned long abs(long input)
{
if (input >= 0)
{
// input is positive
// We know this is safe, because the maximum positive signed
// integer is always less than the maximum positive unsigned one
return static_cast<unsigned long>(input);
}
else
{
return static_cast<unsigned long>(-input); // ut oh...
}
}
यह:
unsigned long abs(long input);
इस का एक अनुभवहीन कार्यान्वयन की तरह कुछ लग सकता है कोड अपरिभाषित व्यवहार को ट्रिगर करता है, क्योंकि input
की अस्वीकृति अतिप्रवाह हो सकती है, और हस्ताक्षरित पूर्णांक ओवरफ़्लो ट्रिगर करना अपरिभाषित व्यवहार है। उदाहरण के लिए, 2 एस पूरक मशीनों पर, std::numeric_limits<long>::min()
का पूर्ण मूल्य std::numeric_limits<long>::max()
से 1 बड़ा होगा।
लाइब्रेरी लेखक इस समस्या के आसपास काम करने के लिए क्या कर सकता है?
अच्छा जवाब, यद्यपि अपने खुद के प्रश्न के बावजूद, लेकिन +1। – Bathsheba