2016-04-04 9 views
5

मैं एक बड़ी संख्या को गुप्त करना चाहता हूं, जो कि int32 अधिकतम सीमा से बड़ा है - int # से int32 तक। इसलिए यदि यह अधिकतम सीमा 2147483647 से अधिक है, तो यह फिर से -2147483648 से शुरू होगा। अभी के लिए मैं ऐसा कर रहा हूं:Int32 कनवर्ट करें। अधिकतम + मूल्यवान संख्या int32

long val = 3903086636L; 
long rem = val % 2147483648L; 
long div = val/2147483648L; 
int result = div % 2 == 0 ? (int)rem - 1 : -2147483648 + (int)rem; 

मुझे यकीन नहीं है कि अगर मैं इसे सही तरीके से कर रहा हूं। क्या सी # में ऐसा करने के लिए कोई उपयोगिता कार्य या त्वरित तरीका है?

उत्तर

5

आप checked mode सक्षम, बस इसे अतिप्रवाह के रूप में आप उम्मीद संभाल लेंगे कास्टिंग नहीं है, तो:

int i = (int)val; 

के रूप में मैथ्यू वाटसन ने सुझाव दिया या, यह संकलक की स्थापना स्वतंत्र बनाने के लिए:

int i = unchecked((int)val); 

यह एक अपवाद नहीं फेंक देगा। पूर्णांक अतिप्रवाह होगा और int.MinValue से गिनती जारी रखेगा।

सबूत:

long val = (long)int.MaxValue + 1; 
int result = (int)val; 

Console.WriteLine(result == int.MinValue); // true 
+0

यदि मैं चेक मोड अक्षम करता हूं तो यह मेरे एप्लिकेशन को प्रभावित करेगा? – Arnab

+0

डिफ़ॉल्ट रूप से यह अक्षम है, इसलिए नहीं। –

+4

या आप 'int i = अनचेक ((int) वैल) लिख सकते हैं;' और यह कंपाइलर की 'चेक' सेटिंग के बावजूद काम करेगा। –

0

क्यों बस int.MinValue के बाकी जोड़ नहीं:

long tmp = myValue - int.MaxValue; 
while(tmp > int.MaxValue) tmp -= int.MaxValue; 

if (tmp > 0) tmp = int.MinValue + tmp; 

पाश को बरकरार रखता है कि आप संख्याओं कि भी अधिक से अधिक तो 2 * int.MaxValue हैं पर काम कर सकते हैं।

यदि आप इसका उपयोग करते हैं और myValue = 3 * int.MaxValue + 1 के साथ परीक्षण करते हैं तो आपको परिणामस्वरूप 2147483647 मिल जाएगा।

+1

क्या होगा यदि 'myValue' '4 * int.MaxValue' के बराबर है? – wimh

+0

@ विममेल अच्छा बिंदु, मुझे लगता है कि हमें इस मामले में एक लूप की आवश्यकता है, जल्द ही इसे अपडेट कर देगा। – HimBromBeere

+0

यदि 'myValue'' int.MaxValue + 1' के बराबर है, तो मेरा मानना ​​है कि परिणाम 'int.MinValue' होना चाहिए और' int.MinValue + 1' नहीं होना चाहिए। यदि 'myValue'' 2 * int.MaxValue + 2' के बराबर है, तो मेरा मानना ​​है कि परिणाम '0' होना चाहिए और नहीं 'int.MinValue + 2'। – wimh

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