क्या मैं इंट में लंबे समय तक परिवर्तित कर सकता हूं?


142

मैं रूपांतरित होना चाहता हूं long करने के लिए int

यदि मान का long>int.MaxValue , मैं इसे चारों ओर लपेटने के लिए खुश हूँ।

सबसे अच्छा तरीका क्या है?

जवाबों:


218

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

int myIntValue = unchecked((int)myLongValue);

15
किसी और के लिए जो मेरे पास एक ही सवाल था: ध्यान दें कि MSBs को छोड़ने से परिणाम के संकेत पर प्रभाव पड़ सकता है । उपरोक्त के साथ, सकारात्मक myIntValueहोने पर नकारात्मक को समाप्त कर सकता myLongValueहै ( 4294967294 => -2) और इसके विपरीत ( -4294967296 => 0)। इसलिए, जब कोई CompareToऑपरेशन लागू कर रहा हो, उदाहरण के लिए, आप खुशी-खुशी एक- longदूसरे से घटाकर दूसरे का परिणाम नहीं निकाल सकते हैं int; कुछ मूल्यों के लिए, आपकी तुलना एक गलत परिणाम देगी।
टीजे क्राउडर

21
@ क्रिस: हुड के तहत new Random()उपयोग करता है Environment.TickCount; घड़ी की टिक के साथ मैन्युअल रूप से बीज लगाने की कोई आवश्यकता नहीं है।
मेहरदाद अफश्री

@MehrdadAfshari हमेशा से ऐसा ही रहा है?
क्रिस मैरिसिक

3
हालांकि यह वर्षों पहले था, इसका कारण मैंने इसे नए रैंडम में उपयोग किया था, यह था कि मुझे एक यूनिट परीक्षण में वही सटीक परिणाम मिल रहे थे और मैं गठबंधन चाहता था। संख्या का उपयोग करके मुझे विचरण दिया।
क्रिस मैरिकिक

3
डिफ़ॉल्ट संदर्भ है unchecked, इसलिए जब तक आपने स्पष्ट रूप से इसे नहीं बदला है, तब uncheckedकीवर्ड (जैसा कि इस उत्तर में दिखाया गया है और @ क्रिसमैरिसिक की टिप्पणी, आदि) की आवश्यकता नहीं है, और int myIntValue = (int)myLongValueबिल्कुल समकक्ष है। हालाँकि, ध्यान दें कि आप uncheckedकीवर्ड का उपयोग करते हैं या नहीं, आपको @TJCrowder द्वारा वर्णित गैर-गणितीय असभ्य व्यवहार मिल रहा है जहां साइन कुछ अतिप्रवाह मामलों में फ्लिप कर सकते हैं। गणितीय शुद्धता को सही मायने में सुनिश्चित करने का एकमात्र तरीका checked(...)संदर्भ का उपयोग करना है, जहां उन मामलों में एक अपवाद फेंक दिया जाएगा।
ग्लेन स्लेडेन

35
Convert.ToInt32(myValue);

हालांकि मुझे नहीं पता कि यह क्या होगा जब यह int.MaxValue से अधिक होगा।


42
"हालांकि मुझे नहीं पता कि यह क्या होगा जब यह int.MaxValue से अधिक होगा " यह एक फेंक देगा OverflowException, जो कि ओपी नहीं चाहता है: msdn.microsoft.com/en-us/library/d4haekc4.aspx
टीजे क्राउडर

4
परीक्षण करें अगर myValue> Integer.Max, कन्वर्ट को चलाने से पहले, यदि आपको MyValue> Integer.Max के दौरान अन्य प्रसंस्करण करने की आवश्यकता है। Convert.ToInt32 (myValue) अतिप्रवाह (कोई अपवाद नहीं, मेरा मानना ​​है) अन्यथा। यह विधि VB.NET में भी काम करती है।
TamusJRoyce

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

1
@ रीचर्डजुन उम, नहीं? यहां ओपी स्पष्ट रूप से कहता है, " यदि लंबे> int। MaxValue का मूल्य है, तो मैं इसे चारों ओर लपेटने के लिए खुश हूं। " मैं आपके कथन को सामान्य रूप से बहस करते देख सकता हूं, लेकिन इस विशिष्ट मामले में , नहीं, Convertयह अच्छा नहीं है।
रफिन

if (value > Int32.MaxValue) return Int32.MaxValue; else return Convert.ToInt32( value );
सेर्गेई

15

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

int checkSumAsInt32 = checkSumAsIn64.GetHashCode();

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

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

9

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

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

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


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

1

यह द्वारा परिवर्तित कर सकते हैं

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.

यहाँ एक लंबी व्याख्या है।


0

नहीं होगा

(int) Math.Min(Int32.MaxValue, longValue)

सही तरीके से, गणितीय रूप से बोल रहा हूँ?


यह होगा क्लैंपlongValue निकटतम प्रदर्शनीय को intयदि मूल मूल्य बहुत बड़ा है। लेकिन इसमें बहुत अधिक नकारात्मक इनपुट के समान उपचार का अभाव है, जो इसके बजाय सबसे महत्वपूर्ण बिट्स खो देगा; आपको Int32.MinValueभी तुलना करने की आवश्यकता होगी । मूल पोस्टर को क्लैम्पिंग नहीं लगता था, हालांकि।
जेपी स्टिग नीलसन

आईएमएचओ कभी-कभी गलत मूल्य से अपवाद पाने के लिए बेहतर होता है, जो कि इंट 32.मैक्सवैल्यू होगा ...
जी। गोंचारोव

0

निम्न समाधान int.MinValue / int.MaxValue के लिए छोटा हो जाएगा यदि मान पूर्णांक सीमा से बाहर है।

myLong < int.MinValue ? int.MinValue : (myLong > int.MaxValue ? int.MaxValue : (int)myLong)

0

एक संभव तरीका यह है कि मॉडुलो ऑपरेटर का उपयोग केवल मूल्यों को इंट 32 रेंज में रहने दें, और फिर इसे इंट में डाल दें।

var intValue= (int)(longValue % Int32.MaxValue);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.