2009-05-13 10 views

उत्तर

170

बस (int)myLongValue करें। unchecked संदर्भ (जो संकलक डिफ़ॉल्ट है) में यह वही करेगा जो आप चाहते हैं (एमएसबी को छोड़कर और एलएसबी लेना)। यह checked संदर्भ में OverflowException फेंक अगर मूल्य एक int में फिट नहीं करता है करेंगे:

int myIntValue = unchecked((int)myLongValue); 
+12

किसी और के लिए जिसने एक ही प्रश्न किया था: ध्यान दें कि एमएसबी को छोड़कर परिणाम के * साइन * पर असर पड़ सकता है। उपर्युक्त के साथ, 'myIntValue' नकारात्मक हो सकता है जब' myLongValue' सकारात्मक है ('42 9 4 9 67294 => -2') और इसके विपरीत (' -4294967296 => 0')। तो उदाहरण के लिए, 'तुलना करने के लिए' ऑपरेशन को लागू करते समय, आप खुशी से किसी 'लम्बे' को दूसरे से 'int' में घटाकर और उसे वापस करने का नतीजा नहीं दे सकते; कुछ मूल्यों के लिए, आपकी तुलना गलत परिणाम देगा। –

+18

+1 'नया रैंडम (अनचेक ((int) डेटटाइम.अब टिक्स में उपयोग किया जाता है)) –

+16

@ क्रिस:' नया रैंडम() 'हुड के तहत 'पर्यावरण। टिककाउंट' का उपयोग करता है; घड़ी की टिकों के साथ मैन्युअल रूप से बीज की आवश्यकता नहीं है। –

25
Convert.ToInt32(myValue); 

हालांकि मैं यह क्या है जब यह int.MaxValue से बड़ा है क्या करेंगे पता नहीं है।

+34

* "हालांकि मुझे नहीं पता कि यह इंटेल से अधिक होने पर क्या करेगा। मैक्सवेल्यू" * यह एक 'ओवरफ्लो एक्सेप्शन' फेंक देगा, जो ओपी बिल्कुल नहीं चाहता है: http://msdn.microsoft.com /en-us/library/d4haekc4.aspx –

+4

यदि मेरा वैल्यू> Integer.Max है तो कनवर्ट करने से पहले मेरा वैल्यू> इंटीजर.मैक्स परीक्षण करें, यदि आपको अन्य प्रसंस्करण करने की आवश्यकता है, तो myValue> Integer.Max। कनवर्ट करें। IInt32 (myValue) ओवरफ्लो (कोई अपवाद नहीं, मुझे विश्वास है) अन्यथा। यह विधि वीबीएनईटी में भी काम करती है। – TamusJRoyce

+3

जबकि (int) मान्य है, कनवर्ट एक बेहतर उत्तर है। अजीब डेटा की तुलना में अजीब अपवादों के लिए बेहतर है। –

13

कभी-कभी आप वास्तव में वास्तविक मूल्य में रूचि नहीं रखते हैं, लेकिन इसके उपयोग में चेकसम/हैशकोड के रूप में उपयोग में है। इस मामले में, निर्मित विधि GetHashCode() एक अच्छा विकल्प है:

int checkSumAsInt32 = checkSumAsIn64.GetHashCode(); 
+5

यह कुछ समय पहले किया गया के बाद से इस सवाल का जवाब दिया गया था है, हालांकि मैं चाहता हूँ उल्लेख करें कि हैशकोड कार्यान्वयन .NET संस्करणों के बीच भिन्न हो सकता है। यह वास्तव में नहीं हो रहा है, लेकिन इस बात की कोई गारंटी नहीं है कि यह मान अलग-अलग एप्लिकेशन रन/एपडोमेन के बीच समान है। – Caramiriel

+1

@Caramiriel क्या कह रहा है में जोड़ने के लिए: यदि आपके वर्तमान ऐप सत्र के दौरान * अस्थायी * हैशकोड के रूप में उपयोग करना है, तो 'GetHashCode' एक उपयुक्त विकल्प है। यदि आप * लगातार चेकसम * के बाद हैं - एक मान जो आपके ऐप को बाद में चलाएगा, तो 'GetHashCode' का उपयोग न करें, क्योंकि यह हमेशा के लिए एक ही एल्गोरिदम होने की गारंटी नहीं है। – ToolmakerSteve

6

सुरक्षित और तेज़ तरीका डाली से पहले बिट मास्किंग उपयोग करने के लिए है ...

int MyInt = (int) (MyLong & 0xFFFFFFFF) 

बिट मास्क (0xFFFFFFFF) मूल्य Int के आकार पर निर्भर करेगा क्योंकि Int आकार मशीन पर निर्भर है।

+0

यह तय करने की आवश्यकता है कि आप क्या करना चाहते हैं जब परिणाम या तो अतिप्रवाह होगा, या ऋणात्मक संख्या बन जाएगा। जो भी आप दिखाते हैं वह अभी भी बह जाएगा, आईआईआरसी, क्योंकि आप साइन बिट को दे रहे हैं। [जैसा कि किसी अन्य उत्तर में बताया गया है, 'अनचेक' संदर्भ में आपको ओवरफ़्लो नहीं मिलेगा - लेकिन ओवरफ़्लो से बचने के लिए आपको 'अनचेक' में मुखौटा करने की आवश्यकता नहीं है, इसलिए समाधान को केवल 'चेक' संदर्भ में जरूरी है।] 16-बिट्स के लिए उदाहरण। हस्ताक्षर किए गए 16-बिट्स (-32768, 32767) हैं। 0xFFFF के साथ मास्किंग 65535 तक की इजाजत देता है, जिससे अतिप्रवाह, आईआईआरसी होता है। साइन बिट, 0x7FFF या 0x7FFFFFFF से बचने के लिए मुखौटा हो सकता है, अगर केवल सकारात्मक चाहिए। – ToolmakerSteve

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