C #에서 uint를 int로 어떻게 변환합니까?


99

C #에서 uint를 int로 어떻게 변환합니까?


5
이렇게하면 int 값을 오버플로 할 수 있습니다.
Powerlord

1
예, uint의 값이 Int32.MaxValue (2,147,483,647)보다 큰 경우 개체를 허용 가능한 상태로 설정하여 예외를 정상적으로 처리해야합니다.
Michael Meadows

변환하는 것이 안전 할 것이다 uintA와 longA가 같은 long모든 포함 할 수 uint는 다음과 같이 값이 int없습니다 (수 이미 언급 한 )
리암

답변:


186

주어진:

 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가 더 나은 선택입니다.
mmcdole

4
@Luke-아니요, 반드시 그런 것은 아닙니다. 캐스트 할 때 선택 또는 선택 취소 된 산술이 기본값인지 여부는 프로젝트 빌드 설정에 따라 다릅니다. 또한 선택 및 선택 취소 된 키워드를 사용하여 로컬 단위로이를 수정할 수 있습니다.
Greg Beech

@Greg : 사실이지만 기본 설정은 선택 취소되어 있습니다.
LukeH

@GregBeech이 동작은 이식 ​​가능합니까? 확인되지 않은 접근의 경우 ??

12

checkedunchecked키워드를 기록해 둡니다.

결과가 int로 잘 리거나 결과가 부호있는 32 비트에 맞지 않는 경우 예외가 발생하려는 경우 중요합니다. 기본값은 선택 취소입니다.


2
기본값이 선택되지 않은 것 같습니다. 이를 지적하는 +1-디버그하기 어려운 오류의 원인.

당신 말이 맞아, 내 잘못이야, 고마워! - "이 옵션의 기본값은 / checked입니다
Kenan EK

선택하지 않으면 "잘리지"않습니다.
fractor

9

한 유형에서 32 비트를 간단히 들어 올려 다른 유형에 그대로 덤프하려고한다고 가정합니다.

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

대상 유형은 맹목적으로 32 비트를 선택하여 재 해석합니다.

반대로 대상 유형 자체의 범위 내에서 십진수 / 숫자 값을 유지하는 데 더 관심이있는 경우 :

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

이 경우 다음과 같은 경우 오버플로 예외가 발생합니다.

  • 음의 정수 (예 : -1)를 uint로 캐스팅
  • 2,147,483,648에서 4,294,967,295 사이의 양의 단위를 int로 캐스팅

우리의 경우 unchecked32 비트를 그대로 유지 하는 솔루션을 원했기 때문에 다음과 같은 몇 가지 예가 있습니다.

int => 단위

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 => 정수

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에 대해 크면 'false'를 반환합니다.
> 0으로 이동하는 한 uint가 int보다 훨씬 클 수 있음을 잊지 마십시오.



-1
int intNumber = (int)uintNumber;

예상되는 값의 종류에 따라 변환을 수행하기 전에 uintNumber가 얼마나 큰지 확인할 수 있습니다. int는 uint의 최대 값이 약 .5입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.