ฉันจะแปลง uint เป็น int ใน C # ได้อย่างไร


101

ฉันจะแปลง uint เป็น int ใน C # ได้อย่างไร


5
โปรดทราบว่าคุณสามารถล้นค่าของ int ได้หากคุณทำเช่นนี้
Powerlord

1
ใช่คุณจะต้องแน่ใจว่าได้จัดการข้อยกเว้นอย่างสง่างามโดยวางวัตถุของคุณให้อยู่ในสถานะที่ยอมรับได้หากค่าของ uint มากกว่า Int32 MaxValue (ซึ่งเป็น 2,147,483,647)
Michael 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

- แก้ไข

รวมข้อมูลตามที่กล่าวโดยKenan EK


4
โปรดทราบว่าถ้าuintมีค่ามากกว่าที่คุณจะได้รับผลลบถ้าคุณใช้การโยนหรือยกเว้นถ้าคุณใช้int.MaxValue Convert.ToInt32
LukeH

4
ซึ่งทำให้ Convert ToInt32 เป็นตัวเลือกที่ดีกว่า imo
mmcdole

4
@ ลุค - ไม่ไม่จำเป็น เมื่อแคสต์ขึ้นอยู่กับการตั้งค่าการสร้างโปรเจ็กต์ของคุณว่าเลขคณิตที่เลือกหรือไม่เลือกเป็นค่าเริ่มต้น นอกจากนี้คุณสามารถแก้ไขสิ่งนี้ในท้องถิ่นได้โดยใช้คำหลักที่เลือกและไม่เลือก
Greg Beech

@Greg: นั่นเป็นความจริง แต่การตั้งค่าเริ่มต้นนอกกรอบจะไม่ถูกเลือก
LukeH

@GregBeech พฤติกรรมนี้พกพาได้หรือไม่? ในกรณีที่ไม่เลือกวิธี ??

12

จดคำสำคัญcheckedและunchecked

เป็นเรื่องสำคัญหากคุณต้องการให้ผลลัพธ์ถูกตัดทอนเป็น int หรือมีข้อยกเว้นที่เพิ่มขึ้นหากผลลัพธ์ไม่พอดีกับ 32 บิตที่เซ็นชื่อ ค่าเริ่มต้นจะไม่ถูกเลือก


2
ฉันเชื่อว่าค่าเริ่มต้นไม่ถูกเลือก +1 เพื่อชี้สิ่งนี้ - ที่มาของข้อผิดพลาดที่ยากต่อการแก้ไขข้อบกพร่อง

คุณพูดถูกฉันไม่ดีขอบคุณ! - "ค่าเริ่มต้นสำหรับตัวเลือกนี้คือ / checked-"
Kenan EK

การไม่เลือกไม่ได้ "ตัดทอน"
แฟร็กเตอร์

10

สมมติว่าคุณต้องการเพียงแค่ยก 32 บิตจากประเภทหนึ่งและถ่ายโอนข้อมูลตามที่เป็นอยู่ไปยังประเภทอื่น:

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

ประเภทปลายทางจะสุ่มเลือก 32 บิตและตีความใหม่

ในทางกลับกันหากคุณสนใจที่จะรักษาค่าทศนิยม / ตัวเลขให้อยู่ในช่วงของประเภทปลายทางเอง:

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

ในกรณีนี้คุณจะได้รับข้อยกเว้นล้นหาก:

  • การส่ง int เชิงลบ (เช่น -1) ไปยัง uint
  • ส่งผลบวกระหว่าง 2,147,483,648 และ 4,294,967,295 ถึง int

ในกรณีของเราเราต้องการuncheckedวิธีแก้ปัญหาเพื่อรักษา 32 บิตตามที่เป็นอยู่ดังนั้นนี่คือตัวอย่างบางส่วน:

ตัวอย่าง

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

สมมติว่าค่าที่อยู่ใน uint สามารถแสดงเป็น int ได้ดังนั้นจึงทำได้ง่าย ๆ ดังนี้:

int val = (int) uval;


0

ฉันจะบอกว่าใช้ tryParse มันจะส่งคืน 'เท็จ' ถ้า uint ใหญ่สำหรับ int
อย่าลืมว่า uint สามารถไปได้มากกว่า int มากตราบเท่าที่คุณไป> 0



-1
int intNumber = (int)uintNumber;

ขึ้นอยู่กับประเภทของค่าที่คุณคาดหวังคุณอาจต้องการตรวจสอบว่า uintNumber มีขนาดใหญ่เพียงใดก่อนที่จะทำการแปลง int มีค่าสูงสุดประมาณ. 5 ของ uint

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.