簡體   English   中英

如何在C#中將uint轉換為int?

[英]How do I convert uint to int in C#?

如何在C#中將uint轉換為int?

鑒於:

 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提到的信息

記下已checkedunchecked關鍵字。

如果您希望將結果截斷為int,或者如果結果不符合有符號的32位,則會引發異常,這很重要。 默認為未選中。

假設您只想從一種類型中提取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之間投入一個正的uint到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));
}  

Convert.ToInt32()uint作為值。

我會說使用tryParse,如果uint對於int來說很大,那么它將返回'false'。
不要忘記,只要你> 0,uint就可以比int大得多

假設uint中包含的值可以用int表示,那么它就像這樣簡單:

int val = (int) uval;

uint i = 10;
int j = (int)i;

要么

int k = Convert.ToInt32(i)
int intNumber = (int)uintNumber;

根據您期望的值,您可能需要在進行轉換之前檢查uintNumber的大小。 int的最大值約為.5的uint。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM