아래와 같은 코드가 있다.
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);
'프로그래밍 > C#' 카테고리의 다른 글
[C#] Helper, Provider, Service, Manager 네이밍 관련 정리 (0) | 2024.06.25 |
---|---|
싱글톤을 구현하는 2가지 방법 - Lazy Initialization (지연 초기화), Static Initialization (정적 초기화) (0) | 2024.06.21 |
[디자인패턴]- State 패턴 (0) | 2023.03.14 |
[C#] DateTime값 Serialization/Deserialization시 DateTime.Minvalue 수치 변하는 현상. (0) | 2022.12.16 |
apple client secret 생성을 위한 jwt 만들기 (0) | 2022.07.12 |
댓글