2012-07-31 8 views
8

मैं उस बिंदु पर पहुंचा जहां मुझे गायन और हस्ताक्षरित मानों की तुलना करने की आवश्यकता है। इस स्थिति से पूरी तरह से बचने के लिए अब तक मैंने कोड बेस को हमेशा संशोधित किया है, लेकिन अब मैं ऐसा नहीं कर सकता।हस्ताक्षरित और हस्ताक्षरित मूल्यों की तुलना को उचित रूप से संभालना

तो गायन और हस्ताक्षरित तुलना को संभालने का वास्तव में उचित तरीका क्या है? यह मिश्रित सी/सी ++ कोड बेस है, इसलिए मेरा प्रश्न दोनों भाषाओं पर लागू होता है।

मैं अनुरोधित मूल्य (हस्ताक्षरित) के खिलाफ संसाधन (हस्ताक्षरित) की जांच कर रहा हूं।

if (requested > resource.max) return Never; 
if (requested > resource.free - resource.assigned) return NotNow; 
return Now; 

मैं इस (स्थानापन्न सी ++ जहां लागू वेरिएंट) की तरह कुछ के बारे में सोच रहा था:

if (requested > (unsigned)INT_MAX) bail_out(); // assert,abort,throw,return.... 
if ((signed)requested > resource.max) return Never; 
if ((signed)requested > resource.free - resource.assigned) return NotNow; 
return Now; 

मैं इस सही ढंग से आ रहा हूँ, या वहाँ कुछ बेहतर तरीका है?

+0

आपकी संसाधन संख्या पहली जगह क्यों हस्ताक्षरित है? –

+1

'resource.free

+1

या क्यों हस्ताक्षरित अनुरोध किया जाता है क्योंकि यह वह मूल्य है जिसे ओपी हस्ताक्षर के रूप में व्यवहार करना चाहता है। वैसे भी यह दृष्टिकोण मेरे लिए ठीक लगता है। इस तरह की चीजें इतनी थकाऊ है कि मैं बिना हस्ताक्षर किए गए प्रकारों से पूरी तरह से बचने के लिए प्रवृत्त हूं। – jahhaj

उत्तर

9

आप एक प्रारंभिक बिंदु के रूप में इस एक लाइनर कोड का उपयोग कर सकते इसे सुरक्षित रूप से करने के लिए:

bool GreaterSignedUnsigned(unsigned int u, signed int i) 
{ 
    // calculate the result of (u > i) 

    // if i is nonnegative it is safe to compare 2 unsigned values, 
    // otherwise unsigned int is always greater 
    return (i < 0) || (u > static_cast<unsigned int>(i)); 
} 

पी.एस. अतिरिक्त तुलना के बाद मिश्रित हस्ताक्षरित/हस्ताक्षरित तुलनाओं से बचने के लिए यह एक अच्छा अभ्यास है और एक कलाकार प्रदर्शन हानि का कारण बन सकता है।

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