Làm cách nào để chuyển đổi uint thành int trong C #?


99

Làm cách nào để chuyển đổi uint thành int trong C #?


5
Lưu ý rằng bạn có thể làm tràn giá trị của một int nếu bạn làm điều này.
Powerlord

1
Có, bạn sẽ phải chắc chắn một cách duyên dáng xử lý các ngoại lệ bằng cách đặt đối tượng của bạn trong tình trạng chấp nhận được nếu giá trị của uint lớn hơn Int32.MaxValue (mà sẽ xảy ra là 2,147,483,647)
Michael Meadows

Nó sẽ được an toàn hơn để chuyển đổi uintđến một longnhư một longthể chứa tất cả uintcác giá trị nơi như một intkhông thể ( như đã đề cập )
Liam

Câu trả lời:


186

Được:

 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

hoặc là

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

--BIÊN TẬP

Thông tin bao gồm như đã đề cập bởi Kenan EK


4
Lưu ý rằng nếu uintlớn hơn, int.MaxValuebạn sẽ nhận được kết quả âm tính nếu bạn sử dụng phương pháp cast hoặc một ngoại lệ nếu bạn sử dụng Convert.ToInt32.
LukeH

4
Điều này làm cho Convert.ToInt32 trở thành lựa chọn tốt hơn imo.
mmcdole

4
@Luke - Không, không nhất thiết. Khi truyền, nó phụ thuộc vào cài đặt xây dựng dự án của bạn xem số học được chọn hay không được chọn là mặc định. Ngoài ra, bạn có thể sửa đổi điều này trên cơ sở cục bộ bằng cách sử dụng các từ khóa được chọn và không được chọn.
Greg Beech

@Greg: Đúng vậy, nhưng cài đặt mặc định bên ngoài hộp không được chọn.
LukeH

@GregBctures Hành vi này có di động không? trong trường hợp tiếp cận không được kiểm soát ??

12

Ghi chú các từ khóa checkedunchecked

Nó quan trọng nếu bạn muốn kết quả bị cắt ngắn thành int hoặc một ngoại lệ được nêu ra nếu kết quả không phù hợp với 32 bit có dấu. Mặc định không được chọn.


2
Tôi tin rằng mặc định không được chọn. +1 để chỉ ra điều này - nguồn gốc của các lỗi khó gỡ lỗi.

Bạn đúng, xấu của tôi, cảm ơn! - "Giá trị mặc định cho tùy chọn này là / checked-"
Kenan EK

Bỏ chọn không "cắt ngắn".
fractor

9

Giả sử bạn chỉ muốn nâng 32bits từ một loại và chuyển chúng nguyên trạng sang loại khác:

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

Kiểu đích sẽ chọn 32 bit một cách mù quáng và diễn giải lại chúng.

Ngược lại, nếu bạn quan tâm hơn đến việc giữ các giá trị thập phân / số trong phạm vi của chính loại đích:

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

Trong trường hợp này, bạn sẽ nhận được các ngoại lệ tràn nếu:

  • truyền một int phủ định (ví dụ: -1) tới một uint
  • truyền một uint dương giữa 2,147,483,648 và 4,294,967,295 thành một int

Trong trường hợp của chúng tôi, chúng tôi muốn uncheckedgiải pháp để giữ nguyên 32bit, vì vậy đây là một số ví dụ:

Ví dụ

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

Giả sử rằng giá trị chứa trong uint có thể được biểu diễn dưới dạng int, thì nó đơn giản như sau:

int val = (int) uval;


0

Tôi sẽ nói bằng cách sử dụng tryParse, nó sẽ trả về 'false' nếu uint là lớn cho một int.
Đừng quên rằng một uint có thể lớn hơn nhiều int, miễn là bạn> 0



-1
int intNumber = (int)uintNumber;

Tùy thuộc vào loại giá trị bạn đang mong đợi, bạn có thể muốn kiểm tra xem uintNumber lớn như thế nào trước khi thực hiện chuyển đổi. Một int có giá trị tối đa khoảng 0,5 của uint.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.