जवाबों:
बस करो (int)myLongValue। यह वही होगा जो आप चाहते हैं (MSBs को छोड़ना और LSBs लेना) uncheckedसंदर्भ में (जो कि कंपाइलर डिफ़ॉल्ट है)। यदि संदर्भ में फिट नहीं है, तो यह संदर्भ OverflowExceptionमें फेंक देगा :checkedint
int myIntValue = unchecked((int)myLongValue);
new Random()उपयोग करता है Environment.TickCount; घड़ी की टिक के साथ मैन्युअल रूप से बीज लगाने की कोई आवश्यकता नहीं है।
unchecked, इसलिए जब तक आपने स्पष्ट रूप से इसे नहीं बदला है, तब uncheckedकीवर्ड (जैसा कि इस उत्तर में दिखाया गया है और @ क्रिसमैरिसिक की टिप्पणी, आदि) की आवश्यकता नहीं है, और int myIntValue = (int)myLongValueबिल्कुल समकक्ष है। हालाँकि, ध्यान दें कि आप uncheckedकीवर्ड का उपयोग करते हैं या नहीं, आपको @TJCrowder द्वारा वर्णित गैर-गणितीय असभ्य व्यवहार मिल रहा है जहां साइन कुछ अतिप्रवाह मामलों में फ्लिप कर सकते हैं। गणितीय शुद्धता को सही मायने में सुनिश्चित करने का एकमात्र तरीका checked(...)संदर्भ का उपयोग करना है, जहां उन मामलों में एक अपवाद फेंक दिया जाएगा।
Convert.ToInt32(myValue);
हालांकि मुझे नहीं पता कि यह क्या होगा जब यह int.MaxValue से अधिक होगा।
OverflowException, जो कि ओपी नहीं चाहता है: msdn.microsoft.com/en-us/library/d4haekc4.aspx
Convertयह अच्छा नहीं है।
if (value > Int32.MaxValue) return Int32.MaxValue; else return Convert.ToInt32( value );
कभी-कभी आपको वास्तव में वास्तविक मूल्य में दिलचस्पी नहीं होती है, लेकिन चेकसम / हैशकोड के रूप में इसके उपयोग में । इस मामले में, अंतर्निहित विधि GetHashCode()एक अच्छा विकल्प है:
int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
GetHashCodeएक उपयुक्त विकल्प है। यदि आप लगातार चेकसम के बाद हैं - एक मूल्य जो आपके ऐप को बाद में चलाने पर समान होगा, तो उपयोग न करें GetHashCode, क्योंकि यह हमेशा के लिए एक ही एल्गोरिदम होने की गारंटी नहीं है।
सुरक्षित और सबसे तेज़ तरीका है कास्ट से पहले बिट मास्किंग का उपयोग करना ...
int MyInt = (int) ( MyLong & 0xFFFFFFFF )
बिट मास्क ( 0xFFFFFFFF) मान इंट के आकार पर निर्भर करेगा क्योंकि इंट आकार मशीन पर निर्भर है।
uncheckedसंदर्भ में आपको एक अतिप्रवाह नहीं मिलेगा - लेकिन आपको uncheckedअतिप्रवाह से बचने के लिए मुखौटा लगाने की आवश्यकता नहीं है , इसलिए एक समाधान केवल checkedसंदर्भ में आवश्यक है ।] उदाहरण 16-बिट्स के लिए। 16-बिट्स वाले हस्ताक्षर (-32768, 32767)। 0xFFFF के साथ मास्किंग 65535 तक मूल्य की अनुमति देता है, जिससे अतिप्रवाह होता है, IIRC। यदि केवल सकारात्मक चाहते हैं, तो साइन बिट, 0x7FFF या 0x7FFFFFFF से बचने के लिए मास्क लगा सकते हैं।
यह द्वारा परिवर्तित कर सकते हैं
Convert.ToInt32 विधि
लेकिन यह एक OverflowException को फेंक देगा यदि यह मान Int32 प्रकार की बाहरी सीमा है। एक मूल परीक्षण हमें दिखाएगा कि यह कैसे काम करता है:
long[] numbers = { Int64.MinValue, -1, 0, 121, 340, Int64.MaxValue };
int result;
foreach (long number in numbers)
{
try {
result = Convert.ToInt32(number);
Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.",
number.GetType().Name, number,
result.GetType().Name, result);
}
catch (OverflowException) {
Console.WriteLine("The {0} value {1} is outside the range of the Int32 type.",
number.GetType().Name, number);
}
}
// The example displays the following output:
// The Int64 value -9223372036854775808 is outside the range of the Int32 type.
// Converted the Int64 value -1 to the Int32 value -1.
// Converted the Int64 value 0 to the Int32 value 0.
// Converted the Int64 value 121 to the Int32 value 121.
// Converted the Int64 value 340 to the Int32 value 340.
// The Int64 value 9223372036854775807 is outside the range of the Int32 type.
यहाँ एक लंबी व्याख्या है।
नहीं होगा
(int) Math.Min(Int32.MaxValue, longValue)
सही तरीके से, गणितीय रूप से बोल रहा हूँ?
longValue निकटतम प्रदर्शनीय को intयदि मूल मूल्य बहुत बड़ा है। लेकिन इसमें बहुत अधिक नकारात्मक इनपुट के समान उपचार का अभाव है, जो इसके बजाय सबसे महत्वपूर्ण बिट्स खो देगा; आपको Int32.MinValueभी तुलना करने की आवश्यकता होगी । मूल पोस्टर को क्लैम्पिंग नहीं लगता था, हालांकि।
myIntValueहोने पर नकारात्मक को समाप्त कर सकताmyLongValueहै (4294967294 => -2) और इसके विपरीत (-4294967296 => 0)। इसलिए, जब कोईCompareToऑपरेशन लागू कर रहा हो, उदाहरण के लिए, आप खुशी-खुशी एक-longदूसरे से घटाकर दूसरे का परिणाम नहीं निकाल सकते हैंint; कुछ मूल्यों के लिए, आपकी तुलना एक गलत परिणाम देगी।