আমি দীর্ঘ ইন ইন রূপান্তর করতে পারি?


142

আমি রূপান্তর করতে চান longকরতে int

যদি long> এর মান int.MaxValueহয় তবে আমি এটি চারপাশে গুটিয়ে রাখতে পেরে খুশি।

সবচেয়ে ভালো উপায় কি?

উত্তর:


218

শুধু কর (int)myLongValue। এটি আপনি যা চান (এমএসবিগুলি বাতিল করে এবং এলএসবি গ্রহণ করছেন) ঠিক তেমনটি করবে unchecked(যা সংকলক ডিফল্ট। এটা তোলে নিক্ষেপ করব OverflowExceptionমধ্যে checkedপ্রসঙ্গ যদি মান একটি ইন মাপসই করা হবে না int:

int myIntValue = unchecked((int)myLongValue);

15
নোট MSBs খারিজ উপর একটি প্রভাব ফেলতে পারে যে: অন্য কেউ যারা একই প্রশ্ন আমি করেছিল চিহ্ন ফলাফলের। উপরের সাহায্যে, ইতিবাচক ( ) এবং তদ্বিপরীত ( ) myIntValueহলে নেতিবাচক পরিণতি ঘটতে পারে । সুতরাং কোনও অপারেশন বাস্তবায়নের সময় , উদাহরণস্বরূপ, আপনি আনন্দের সাথে একে অপরের থেকে বিয়োগের ফলাফলটি ফেলে দিতে পারবেন না এবং ফিরে আসতে পারবেন না ; কিছু মানের জন্য, আপনার তুলনা একটি ভুল ফলাফল দিতে পারে। myLongValue4294967294 => -2-4294967296 => 0CompareTolongint
টিজে ক্রাউডার

21
@ ক্রিস: ফণা নীচে new Random()ব্যবহার Environment.TickCountকরে; ঘড়ির টিক্সের সাহায্যে ম্যানুয়ালি বীজ বপন করার দরকার নেই।
মেহরদাদ আফশারী

@ মেহরদাদআফশারি কি সবসময়ই এরকম?
ক্রিস মেরিসিক

3
যদিও এটি বছর আগে ছিল, আমি নতুন এলোমেলোভাবে এটি ব্যবহার করার কারণটি হ'ল আমি একটি ইউনিট পরীক্ষায় একই সঠিক ফলাফল পাচ্ছিলাম এবং আমি বৈকল্পিকতা চাইছিলাম। নম্বরটি ব্যবহার করে আমাকে বৈকল্পিকতা দেওয়া হয়েছিল।
ক্রিস মেরিসিক

3
ডিফল্ট প্রসঙ্গটি হ'ল unchecked, যদি না আপনি স্পষ্টভাবে এটিকে পরিবর্তন করেন, তবে uncheckedকীওয়ার্ডটি (এই উত্তরে এবং @ ক্রিসমারিসিকের মন্তব্য ইত্যাদিতে প্রদর্শিত হবে) প্রয়োজন নেই এবং int myIntValue = (int)myLongValueঠিক সমান। তবে আপনি uncheckedকীওয়ার্ডটি ব্যবহার করেন বা না করেন তা নির্বিশেষে আপনি @TJCrowder দ্বারা বর্ণিত অ-গাণিতিক অভদ্র ট্রানকেশন আচরণ পাচ্ছেন যেখানে কিছু ওভারফ্লো ক্ষেত্রে সাইনটি উল্টানো যায়। গাণিতিক যথার্থতার সত্যতা নিশ্চিত করার একমাত্র উপায় হ'ল checked(...)প্রসঙ্গটি ব্যবহার করা , যেখানে এই মামলাগুলি একটি ব্যতিক্রম ছুঁড়ে মারবে।
গ্লেন স্লেডেন

35
Convert.ToInt32(myValue);

যদিও এটি আমি জানি না এটি কী করবে যখন এটি ইনটেক্সেক্সের চেয়ে বেশি।


42
"যদিও এটি আমি জানি না এটি ইন্টি-ম্যাক্সভ্যালুয়ের চেয়ে বড় হলে এটি কী করবে " এটি একটি নিক্ষেপ করবে OverflowException, যা ঠিক ওপি চায় না: এমএসডিএন.এম.সাইক্রোসফট /en-us/library/d4haekc4.aspx
টিজে ক্রাউডার

4
কনভার্টটি চালানোর আগে মাইভ্যালু> ইন্টিজার.ম্যাক্স পরীক্ষা করুন, মাইভ্যালু> ইন্টিজার.ম্যাক্স করার সময় আপনার যদি অন্য প্রসেসিংয়ের প্রয়োজন হয়। রূপান্তর করুন.টোইন্ট 32 (মাইভ্যালু) অন্যথায় উপচে পড়বে (কোনও ব্যতিক্রম নয়, আমি বিশ্বাস করি)। এই পদ্ধতিটি ভিবি.এনইটি-তেও কাজ করে।
তমুসজেরোয়েস

3
(ইনট) বৈধ থাকাকালীন রূপান্তর একটি আরও ভাল উত্তর। অদ্ভুত ডেটার চেয়ে অদ্ভুত ব্যতিক্রম হওয়া ভাল।
রিচার্ড

1
@ রিচার্ড জুনে উম, না? ওপি এখানে স্পষ্টতই বলেছে, " যদি লং> ইনটেক্সেক্সভ্যালুয়ের মান হয় তবে আমি এটিকে গুটিয়ে রাখতে পেরে খুশি " "আমি আপনার বক্তব্যকে সাধারণভাবে বিতর্ক করতে দেখতে পাই তবে এই নির্দিষ্ট ক্ষেত্রে , না, Convertভাল নয়।
ruffin

if (value > Int32.MaxValue) return Int32.MaxValue; else return Convert.ToInt32( value );
সের্গেই

15

কখনও কখনও আপনি প্রকৃত মান সম্পর্কে আসলে আগ্রহী নন, তবে চেকসাম / হ্যাশকোড হিসাবে এর ব্যবহারে । এই ক্ষেত্রে, অন্তর্নির্মিত পদ্ধতিটি GetHashCode()একটি ভাল পছন্দ:

int checkSumAsInt32 = checkSumAsIn64.GetHashCode();

7
এই উত্তরটি দেওয়ার পরে কিছুক্ষণ আগে হয়েছে, যদিও আমি উল্লেখ করতে চাই যে হ্যাশকোড প্রয়োগটি .NET সংস্করণগুলির মধ্যে পৃথক হতে পারে। এটি সম্ভবত ঘটছে না, তবে কোনও গ্যারান্টি নেই যে বিভিন্ন অ্যাপ্লিকেশন রান / অ্যাপডোমেনগুলির মধ্যে এই মানটি একই রকম।
ক্যারামিরিল

1
@ ক্যারামিরিল যা বলছে তাতে যুক্ত করার জন্য: যদি আপনার বর্তমান অ্যাপ্লিকেশন সেশনের সময় অস্থায়ী হ্যাশকোড হিসাবে ব্যবহার করা হয় তবে GetHashCodeতা উপযুক্ত পছন্দ। আপনি যদি অবিচ্ছিন্ন চেকসামের পরে থাকেন - তবে পরে আপনার অ্যাপটি চালানোর সময় একই মান হবে তবে ব্যবহার করবেন না GetHashCode, কারণ এটি চিরকাল একই অ্যালগরিদম হওয়ার নিশ্চয়তা দেয় না।
টুলমেকারস্টেভ

9

নিরাপদ এবং দ্রুততম উপায় কাস্ট করার আগে বিট মাস্কিং ব্যবহার করা ...

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

বিট মাস্ক ( 0xFFFFFFFF) মানটি ইন্টার আকারের উপর নির্ভর করবে কারণ মাপের মেশিনের উপর নির্ভরশীল আকার।


ফলাফলটি যখন উপচে পড়বে বা নেতিবাচক সংখ্যায় পরিণত হবে তখন আপনি কী হতে চান তা সিদ্ধান্ত নেওয়া দরকার। আপনি যা দেখান তা এখনও আইআইআরসি উপচে পড়বে কারণ আপনি সাইনটি কিছুটা ছাড়িয়ে যাচ্ছেন। [যেমন অন্য উত্তরে উল্লিখিত হয়েছে, uncheckedপ্রসঙ্গে আপনি ওভারফ্লো পাবেন না - তবে uncheckedউপচে পড়া এড়ানোর জন্য আপনাকে মুখোশ দেওয়ার দরকার নেই, সুতরাং কেবল checkedপ্রসঙ্গে একটি সমাধান প্রয়োজন ]] 16-বিটের উদাহরণ। 16-বিট ধারণ স্বাক্ষরিত (-32768, 32767)। 0xFFFF দিয়ে মাস্কিং 65535 অবধি মূল্য দেয়, ওভারফ্লো, আইআইআরসি সৃষ্টি করে। শুধুমাত্র ইতিবাচক চাইলে সাইন বিট, 0x7FFF বা 0x7FFFFFFF এড়াতে মাস্ক করতে পারে।
টুলমেকারস্টেভ

1

এটি রূপান্তর করতে পারে

রূপান্তর করুন। টুআইন্ট 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.

এখানে একটি দীর্ঘ ব্যাখ্যা আছে।


0

না

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

সঠিক পদ্ধতিতে, গাণিতিকভাবে কথা বলছেন?


এটির নিকটতম উপস্থাপনযোগ্যটিকে ক্ল্যাম্প করবে যদি মূল মানটি বিশাল হয়। তবে এটিতে খুব নেতিবাচক ইনপুটগুলির একই চিকিত্সার অভাব রয়েছে যা এর পরিবর্তে সর্বাধিক উল্লেখযোগ্য বিট হারাবে; আপনার সাথেও তুলনা করা দরকার । যদিও আসল পোস্টারটি ক্ল্যাম্পিং করতে চায়নি বলে মনে হচ্ছে। longValueintInt32.MinValue
জেপ্প স্টিগ নীলসন

এই প্রোগ্রামটিতে কখনও কখনও ভাল ভুল মানের চেয়ে ব্যতিক্রম, যা Int32.MaxValue হবে ... পেতে
জি Goncharov

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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.