আমি কীভাবে সি # তে ইউন্টকে রূপান্তর করব?


101

আমি কীভাবে সি # তে ইউন্টকে রূপান্তর করব?


4
সচেতন হন যে আপনি যদি এটি ব্যবহার করেন তবে আপনি কোনও int এর মান উপচে ফেলে দিতে পারেন।
— পাওয়ারলর্ড

4
হ্যাঁ, তোমার চেয়ে Int32.MaxValue (যা ঘটবে 2.147.483.647 হতে) অত্যন্ত শৃঙ্খলার একটি গ্রহণযোগ্য অবস্থায় আপনার বস্তুর রেখে ব্যতিক্রম হ্যান্ডেলিংয়ের জন্য, যদি uint মান বেশী নিশ্চিত করা হবে
— মাইকেল Meadows,

uintএকটি longহিসাবে রূপান্তর করা নিরাপদ হবে longসমস্ত uintমান থাকতে পারে যেখানে একটি int
— লিয়াম

উত্তর:


191

প্রদত্ত:

 uint n = 3;

int i = checked((int)n); //throws OverflowException if n > Int32.MaxValue
int i = unchecked((int)n); //converts the bits only 
                           //i will be negative if n > Int32.MaxValue

int i = (int)n; //same behavior as unchecked

বা

int i = Convert.ToInt32(n); //same behavior as checked

--EDIT

অন্তর্ভুক্ত তথ্য কেনান ই কে দ্বারা উল্লিখিত হিসাবে


4
মনে রাখবেন যে এর uintচেয়ে int.MaxValueবড়টি যদি আপনি একটি castালাই ব্যবহার করেন তবে negativeণাত্মক ফলাফল পাবেন বা যদি আপনি ব্যবহার করেন তবে ব্যতিক্রম Convert.ToInt32।
— লুক

4
যা কনভার্ট করে o
— এমএমসিডোল

4
@ লুক - না, অগত্যা নয়। কাস্টিংয়ের সময় এটি আপনার প্রকল্পের বিল্ড সেটিংসের উপর নির্ভর করে যাচাই করা বা চেক না করা গাণিতিকটি ডিফল্ট কিনা as এছাড়াও, আপনি চেক এবং চেক না করা কীওয়ার্ড ব্যবহার করে স্থানীয় ভিত্তিতে এটি সংশোধন করতে পারেন।
— গ্রেগ বিচ

@ গ্রেগ: এটি সত্য, তবে ডিফল্ট -র-বক্স-এর সেটিংসটি চেক করা হয়নি।
— লুক এইচ

@ গ্রেগবিচ এই আচরণ কি বহনযোগ্য? চেক না করা পদ্ধতির ক্ষেত্রে ??

12

checkedএবং uncheckedকীওয়ার্ডগুলির নোট নিন ।

আপনি যদি ফলাফলটি স্বাক্ষরিত 32 বা বিটগুলিতে ফিট না করেন তবে উত্থাপিত ব্যতিক্রমটি বা ছাঁটাই করতে চান কিনা তা বিবেচ্য। ডিফল্টটি চেক করা নেই।


4
আমি বিশ্বাস করি ডিফল্টটি চেক করা নেই। এটি দেখানোর জন্য +1 - ডিবাগ করা ত্রুটিগুলির শক্তির উত্স।

আপনি ঠিক বলেছেন, আমার খারাপ, ধন্যবাদ! - "এই বিকল্পের জন্য ডিফল্ট মানটি / পরীক্ষিত-"
— কেনান

চেক করা "কাটা" হয় না।
— ফ্র্যাক্টর

10

ধরে নিই যে আপনি কেবল একটি টাইপ থেকে 32 বিটগুলি তুলতে চান এবং অন্য ধরণের মধ্যে যেমনটি ফেলে দেন:

uint asUint = unchecked((uint)myInt);
int asInt = unchecked((int)myUint);

গন্তব্য প্রকারটি অন্ধভাবে 32 বিটগুলি বেছে নেবে এবং তাদের পুনরায় ব্যাখ্যা করবে।

বিপরীতে যদি আপনি দশমিক / সংখ্যাগত মানগুলি গন্তব্য প্রকারের সীমার মধ্যে রাখতে আগ্রহী হন তবে:

uint asUint = checked((uint)myInt);
int asInt = checked((int)myUint);

এই ক্ষেত্রে, আপনি ওভারফ্লো ব্যতিক্রমগুলি পাবেন যদি:

  • একটি uint এ একটি নেতিবাচক int (যেমন: -1) কাস্টিং
  • একটি ইতিমধ্যে 2,147,483,648 এবং 4,294,967,295 এর মধ্যে একটি ইতিবাচক uint castালাই

আমাদের ক্ষেত্রে, আমরা unchecked32-বিটগুলি যেমন আছে তেমন সংরক্ষণের সমাধান চেয়েছিলাম , সুতরাং এখানে কয়েকটি উদাহরণ দেওয়া হল:

উদাহরণ

int => uint

int....: 0000000000 (00-00-00-00)
asUint.: 0000000000 (00-00-00-00)
------------------------------
int....: 0000000001 (01-00-00-00)
asUint.: 0000000001 (01-00-00-00)
------------------------------
int....: -0000000001 (FF-FF-FF-FF)
asUint.: 4294967295 (FF-FF-FF-FF)
------------------------------
int....: 2147483647 (FF-FF-FF-7F)
asUint.: 2147483647 (FF-FF-FF-7F)
------------------------------
int....: -2147483648 (00-00-00-80)
asUint.: 2147483648 (00-00-00-80)

uint => int

uint...: 0000000000 (00-00-00-00)
asInt..: 0000000000 (00-00-00-00)
------------------------------
uint...: 0000000001 (01-00-00-00)
asInt..: 0000000001 (01-00-00-00)
------------------------------
uint...: 2147483647 (FF-FF-FF-7F)
asInt..: 2147483647 (FF-FF-FF-7F)
------------------------------
uint...: 4294967295 (FF-FF-FF-FF)
asInt..: -0000000001 (FF-FF-FF-FF)
------------------------------

কোড

int[] testInts = { 0, 1, -1, int.MaxValue, int.MinValue };
uint[] testUints = { uint.MinValue, 1, uint.MaxValue / 2, uint.MaxValue };

foreach (var Int in testInts)
{
    uint asUint = unchecked((uint)Int);
    Console.WriteLine("int....: {0:D10} ({1})", Int, BitConverter.ToString(BitConverter.GetBytes(Int)));
    Console.WriteLine("asUint.: {0:D10} ({1})", asUint, BitConverter.ToString(BitConverter.GetBytes(asUint)));
    Console.WriteLine(new string('-',30));
}
Console.WriteLine(new string('=', 30));
foreach (var Uint in testUints)
{
    int asInt = unchecked((int)Uint);
    Console.WriteLine("uint...: {0:D10} ({1})", Uint, BitConverter.ToString(BitConverter.GetBytes(Uint)));
    Console.WriteLine("asInt..: {0:D10} ({1})", asInt, BitConverter.ToString(BitConverter.GetBytes(asInt)));
    Console.WriteLine(new string('-', 30));
}  


0

ধরে নিই যে ইউন্টের মধ্যে থাকা মানটি কোনও অন্তর্গতভাবে উপস্থাপিত হতে পারে তবে এটি এতটা সহজ:

int val = (int) uval;


0

আমি ট্রাই পার্স ব্যবহার করে বলব, যদি ইউটিটি কোনও প্রকারের জন্য বড় হয় তবে এটি 'মিথ্যা' ফিরবে।
ভুলে যাবেন না যে আপনি যতদূর> 0 যাচ্ছেন ততক্ষণ কোনও ইউন্ট একটি ইন্টের চেয়ে অনেক বড় যেতে পারে



-1
int intNumber = (int)uintNumber;

আপনি কী ধরণের মান প্রত্যাশা করছেন তার উপর নির্ভর করে আপনি রূপান্তরটি করার আগে uintNumber কত বড় তা পরীক্ষা করতে পারেন। কোন ইন্টের এক ইউন্টের সর্বাধিক মান .5 হয়।

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