Bagaimana cara mengubah uint ke int di C #?


100

Bagaimana cara mengubah uint ke int di C #?


5
Ketahuilah bahwa Anda bisa melimpah nilai int jika Anda melakukan ini.
Powerlord

1
Ya, Anda harus memastikan untuk menangani pengecualian dengan baik dengan menempatkan objek Anda dalam status yang dapat diterima jika nilai uint lebih besar dari Int32.MaxValue (yang kebetulan 2.147.483.647)
Michael Meadows

Akan lebih aman untuk mengonversi uintke a longkarena longkaleng berisi semua uintnilai di mana sebagai tidak intbisa ( seperti yang telah disebutkan )
Liam

Jawaban:


187

Diberikan:

 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

atau

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

--EDIT

Info yang disertakan seperti yang disebutkan oleh Kenan EK


4
Perhatikan bahwa jika uintlebih besar dari int.MaxValueAnda akan mendapatkan hasil negatif jika Anda menggunakan cast, atau pengecualian jika Anda menggunakan Convert.ToInt32.
LukeH

4
Yang membuat Convert.ToInt32 imo pilihan yang lebih baik.
mmcdole

4
@ Luke - Tidak, belum tentu. Saat mentransmisi, hal itu bergantung pada setelan build project Anda, apakah arithmentic yang dicentang atau tidak dicentang adalah defaultnya. Selain itu, Anda dapat memodifikasi ini secara lokal menggunakan kata kunci yang dicentang dan yang tidak.
Greg Beech

@Greg: Itu benar, tetapi pengaturan default out-of-the-box tidak dicentang.
LukeH

@GregBeech Apakah perilaku ini portabel? dalam kasus pendekatan yang tidak dicentang ??

12

Catat kata kunci checkeddan unchecked.

Ini penting jika Anda ingin hasilnya dipotong ke int atau pengecualian dimunculkan jika hasilnya tidak sesuai dengan 32 bit yang ditandatangani. Defaultnya tidak dicentang.


2
Saya yakin defaultnya tidak dicentang. 1 untuk menunjukkan hal ini - sumber kesalahan yang sulit di-debug.

Anda benar, saya buruk, terima kasih! - "Nilai default untuk opsi ini adalah / diperiksa-"
Kenan EK

Tidak dicentang tidak "memotong".
Fractor

9

Dengan asumsi Anda hanya ingin mengangkat 32 bit dari satu jenis dan membuangnya apa adanya ke jenis lainnya:

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

Jenis tujuan akan secara membabi buta memilih 32 bit dan menafsirkannya kembali.

Sebaliknya, jika Anda lebih tertarik untuk mempertahankan nilai desimal / numerik dalam rentang jenis tujuan itu sendiri:

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

Dalam kasus ini, Anda akan mendapatkan pengecualian luapan jika:

  • mentransmisikan int negatif (misalnya: -1) ke uint
  • melemparkan uint positif antara 2.147.483.648 dan 4.294.967.295 ke int

Dalam kasus kami, kami menginginkan uncheckedsolusi untuk mempertahankan 32 bit sebagaimana adanya, jadi berikut beberapa contohnya:

Contoh

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)
------------------------------

Kode

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

Dengan asumsi bahwa nilai yang terkandung dalam uint dapat direpresentasikan dalam int, maka itu sesederhana:

int val = (int) uval;


0

Saya akan mengatakan menggunakan tryParse, itu akan mengembalikan 'false' jika uint terlalu besar untuk int.
Jangan lupa bahwa uint bisa lebih besar dari int, selama Anda> 0



-1
int intNumber = (int)uintNumber;

Bergantung pada jenis nilai yang Anda harapkan, Anda mungkin ingin memeriksa seberapa besar uintNumber sebelum melakukan konversi. Sebuah int memiliki nilai maksimal sekitar 0,5 dari sebuah uint.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.