잡다한 배똥월드

728x90

 

 

 

 

 

공부를 하다가 다 이해가 되는데 딱 저 ~ 연산자만 이해가 되지 않았다.

어떤 경우에는 그냥 1은 0으로, 0은 1로 바꾸라는데,

문제를 풀다가 이게 이렇게 되면 숫자가 엄청 커지는데...? 하고 의문점이 들어서

열심히 검색해서 이해하게 되었다...

 

 

 

 

 

 

 

 

 

Java일 경우 문제

 

public class Main{
     public static void main(String []args){
        byte a = 19;
        System.out.printf("%d\n", ~a);
     }
}

 

 

 

 

 

 

 

 

byte 자료형인 a의 값인 15를 2진법으로 변환하면 00001111이 된다.

이걸 보통 방식으로 1은 0으로, 0은 1로 변환하면 11110000이 되는데,

 

 

 

 

 

 

이걸 값으로 그냥 환산하면 240이 되는데 결과는 -16이란다...

그래서 읭..? 왜 이러는거지? 했는데 자바는 무조건 부호를 갖는 signed 타입이고,

signed 타입의 경우에는 최상위 비트로 부호를 구분한다고 한다.

그래서 11110000으로는 부호를 구분하고, 00001111에서 1을 더해서 나온 값으로 숫자를 판별한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

즉, 이렇게 해서 ~a 는 -16이 된다.

 

 

 

 

 

 

 

 

 

만약 unsigned 타입이라면 그냥 1은 0, 0은 1로 바뀐 240이 맞다.

 

 

 

 

 

728x90

+ Recent posts