इस दिलचस्प सवाल के आधार पर घटाने:uint और पूर्णांक और निरंतर तह
पर विचार करें: Addition of int and uint और के रूप में Nicholas Carey'sanswer में उल्लेख किया निरंतर तह के साथ चारों ओर toying, मैं संकलक का एक उचित रूप में असंगत व्यवहार पर ठोकर खाई गए कोड स्निपेट निम्नलिखित:
int i = 1;
uint j = 2;
var k = i - j;
यहाँ संकलक सही ढंग से करने के लिए long
k
हल करता है। यह विशेष व्यवहार विनिर्देशों में अच्छी तरह से परिभाषित किया गया है जैसा कि पहले निर्दिष्ट प्रश्न के उत्तर में बताया गया है।
क्या मेरे लिए आश्चर्य की बात थी, कि व्यवहार बदल जाता है जब शाब्दिक स्थिरांक या स्थिरांक सामान्य रूप में साथ काम कर रहा है। पढ़ना निकोलस केरी answer मैंने महसूस किया कि व्यवहार असंगत तो मैं जाँच की और यकीन है कि पर्याप्त हो सकता है:
const int i = 1;
const uint j = 2;
var k = i - j; //Compile time error: The operation overflows at compile time in checked mode.
k = 1 - 2u; //Compile time error: The operation overflows at compile time in checked mode.
k
इस मामले में Uint32
का संकल्प लिया है।
वहाँ व्यवहार भिन्न किया जा रहा है जब स्थिरांक के साथ काम कर या इस एक छोटी लेकिन दुर्भाग्यपूर्ण "बग" (एक बेहतर शब्द की कमी) संकलक में है के लिए एक कारण है?
अनुमान में, कंपाइलर स्थिरांक के लिए निहित रूपांतरण नहीं करता है। – Powerlord
@ पावरलोर्ड वैसे इसे ठीक है, * यह * * int' से 'uint' को स्पष्ट रूप से परिवर्तित कर रहा है। – InBetween
spec इसके लिए अनुमति देता है, यद्यपि ... §6.1.9 लागू निरंतर अभिव्यक्ति रूपांतरण: "प्रकार int की एक निरंतर अभिव्यक्ति (§7.19) प्रकार 'sbyte',' बाइट', 'लघु', ' ushort', 'uint', या 'ulong', बशर्ते निरंतर अभिव्यक्ति का मान गंतव्य प्रकार की सीमा के भीतर है।" अभी भी अक्षर और/या निरंतर चर के लिए यह कहने का प्रयास कर रहा है। – Powerlord