উত্তর:
শুধু কর (int)myLongValue
। এটি আপনি যা চান (এমএসবিগুলি বাতিল করে এবং এলএসবি গ্রহণ করছেন) ঠিক তেমনটি করবে unchecked
(যা সংকলক ডিফল্ট। এটা তোলে নিক্ষেপ করব OverflowException
মধ্যে checked
প্রসঙ্গ যদি মান একটি ইন মাপসই করা হবে না int
:
int myIntValue = unchecked((int)myLongValue);
new Random()
ব্যবহার Environment.TickCount
করে; ঘড়ির টিক্সের সাহায্যে ম্যানুয়ালি বীজ বপন করার দরকার নেই।
unchecked
, যদি না আপনি স্পষ্টভাবে এটিকে পরিবর্তন করেন, তবে unchecked
কীওয়ার্ডটি (এই উত্তরে এবং @ ক্রিসমারিসিকের মন্তব্য ইত্যাদিতে প্রদর্শিত হবে) প্রয়োজন নেই এবং int myIntValue = (int)myLongValue
ঠিক সমান। তবে আপনি unchecked
কীওয়ার্ডটি ব্যবহার করেন বা না করেন তা নির্বিশেষে আপনি @TJCrowder দ্বারা বর্ণিত অ-গাণিতিক অভদ্র ট্রানকেশন আচরণ পাচ্ছেন যেখানে কিছু ওভারফ্লো ক্ষেত্রে সাইনটি উল্টানো যায়। গাণিতিক যথার্থতার সত্যতা নিশ্চিত করার একমাত্র উপায় হ'ল checked(...)
প্রসঙ্গটি ব্যবহার করা , যেখানে এই মামলাগুলি একটি ব্যতিক্রম ছুঁড়ে মারবে।
Convert.ToInt32(myValue);
যদিও এটি আমি জানি না এটি কী করবে যখন এটি ইনটেক্সেক্সের চেয়ে বেশি।
OverflowException
, যা ঠিক ওপি চায় না: এমএসডিএন.এম.সাইক্রোসফট /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 অবধি মূল্য দেয়, ওভারফ্লো, আইআইআরসি সৃষ্টি করে। শুধুমাত্র ইতিবাচক চাইলে সাইন বিট, 0x7FFF বা 0x7FFFFFFF এড়াতে মাস্ক করতে পারে।
এটি রূপান্তর করতে পারে
রূপান্তর করুন। টুআইন্ট 32 পদ্ধতি
তবে মানটি 32 টাইপের সীমার বাইরে থাকলে এটি একটি ওভারফ্লো এক্সেক্সপশন নিক্ষেপ করবে। একটি বেসিক পরীক্ষা আমাদের দেখায় যে এটি কীভাবে কাজ করে:
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
নিম্নলিখিত সমাধানটি মানটি পূর্ণমাত্রার সীমা ছাড়িয়ে গেলে int.MinValue / int.MaxValue এ কাটা হবে।
myLong < int.MinValue ? int.MinValue : (myLong > int.MaxValue ? int.MaxValue : (int)myLong)
myIntValue
হলে নেতিবাচক পরিণতি ঘটতে পারে । সুতরাং কোনও অপারেশন বাস্তবায়নের সময় , উদাহরণস্বরূপ, আপনি আনন্দের সাথে একে অপরের থেকে বিয়োগের ফলাফলটি ফেলে দিতে পারবেন না এবং ফিরে আসতে পারবেন না ; কিছু মানের জন্য, আপনার তুলনা একটি ভুল ফলাফল দিতে পারে।myLongValue
4294967294 => -2
-4294967296 => 0
CompareTo
long
int