본문 바로가기
프로그래밍/C#

-1을 uint에 넣어서 형변환을 하면 어떻게 될까?

by 뽀도 2024. 5. 7.


아래와 같은 코드가 있다. 

 int testA = -1;

 var testB = (uint)testA;

 

이때 testB는 뭐가 될까?? 

uint니까 1이될까??  

땡이다. 위의 코드에 로그를 달아 찍어보자. 

 

 int testA = -1;

 var testB = (uint)testA;

 Console.WriteLine("testA : " + testA);
 Console.WriteLine("testB : " + testB + ", uint max =" + uint.MaxValue +", if(testB == uint.maxValue)" + (testB == uint.MaxValue));

 

흥미롭게도 testB는 예상외의 숫자가 되었다. 

 

4294967295가 의미하는건 뭘까? 
바로 uint.maxvalue 값이다. 

그래서 testB 와 uint.maxValue가 같은지 비교하면 같다고 뜬다. 

 

왜 하필 uint.maxValue값일까?

 

C#에서 uint부호 없는 32비트 정수를 의미한다. 

따라서 음수 값을 uint로 캐스팅하면 양의 정수 값으로 해석되는데, 

음수인 -1을 uint로 캐스팅하면 양의 정수로 변환되는데, 이는 2의 보수 표현법에 의한 결과이다. 

 

uint는 32비트를 사용하므로 -1을 32비트 2의 보수 표현으로 나타내면 모든 비트가 1로 채워진 값이 된다. 

-> 11111111 11111111 11111111 11111111

이진수로 적용된 각 자리는 2^0부터 시작하여 2의 지수로 증가하면서 각 비트에 해당하는 값을 나타내는데, 따라서 위의 이진수는 다음과 같이 계산된다.

 

-> 2^31 + 2^30 + ... + 2^1 + 2^0 = 2^32 - 1

 

이는 부호 없는 정수로 해석될 때는 최대값인 4294967295가 되고, testB의 값이 4294967295가 되는 것이다. 

 

(* 만약 ulong인 경우 64비트를 사용하므로 -1을 64비트 2의 보수 표현으로 나타내면 모든 비트가 1로 채워진 값이 됩니다. 이는 부호 없는 정수로 해석될 때는 최대값인 ulong.MaxValue가 된다.)

 

 

++) 

 

만약 -1을 1로 바꾸고 싶으면 (uint)가 아니라 Math.Abs()함수로 바꾸는게 더 정확하다. 

 

    var testC = Math.Abs(testA);

 

 

 

 

 

 

 

반응형

댓글