Digital Garden by Rycont | 뉴스레터 구독하기

Java 퀴즈 보완

왜 Char에 Bit Operation을 쓰나요

char a = 0xA7;
System.out.println(Integer.toString(~a, 16));

진짜 개 미친 코드다. ~ 연산자는 피연산자로 int/long 타입을 바라는데, long이 아닌 값은 int로 캐스팅된 후 연산이 적용된다고 한다. 그래서 ~a~((int)(0xA7))과 동일한데, (int)0xA7

(int)0xA7
= 0x000000A7
= 0b0000 0000 0000 0000 0000 0000 1010 0111

이걸 ~해서 bit flip 하면

0b1111 1111 1111 1111 1111 1111 0101 1000

인데 첫 비트가 1이라서 음수이다. 2의 보수 표시법으로 나타낸 음수인데.. 그래서 실제 값을 알기 위해 flip하고

0b0000 0000 0000 0000 0000 0000 1010 0111

(원본으로 돌아왔다)

여기에 1 더하면

0b0000 0000 0000 0000 0000 0000 1010 1000

걍 원본에 1 더한거다. 근데 이제 음수인. 그래서 값 자체는 -(0xA8)인데, 이게 Integer.toString에 들어가면.. -a8이라는 괴랄한 표기가 나온다. 나도 모르겠다 진짜

Byte의 범위를 헷갈리지 마 멍청하게 생각해

byte b = 127;
System.out.println(b);

이거 당연히 127

byte b = 127;
b++;
System.out.println(b);

이게 미친놈인데 128이라고 바보 같이 대답하면 안된다.

127 = 0b0111 1111

근데 여기에 1을 더하면

0b1000 0000

이게 128이라고 생각하면 재입학을 하는 편이 낫다. 먼저 봤던 것 처럼 2의 보수 표기법 사용해서

(fliped)
0b0111 1111

(added)
0b1000 0000

-128이다.

소수는 기본적으로 double.

걍 외워야 됨. float는 등장할 일이 잘 없음.

3.14

이렇게 적으면 double임.

캐스팅

길거리 캐스팅이 아니다. 근데 무슨 길거리에서 온 것 처럼 온갖 뒷 이야기가 많다. 암묵적 캐스팅과 컴파일 에러 사이 줄타기.

float a = 3.14;
int b = 3.14;

이거 오류다. double을 float에 넣을 수 없다.

double a = 3.14f;
double b = 3;

이건 잘 된다. float는 와 int는 double에 넣을 수 있다.

개미친 개념. 왜 이런 일이 일어나죠? 암묵적 캐스팅이란게 있다. 자바의 여러 숫자 자료형 사이에는 '위계'가 있는데, 더 훌륭한 자료형은 더 미천한 자료형의 값을 수용할 수 있지만, 미천한 자료형은 훌륭한 자료형을 직접 받아들일 수 없어 '제가 받아도 되겠습니까??'하고 허락을 구해야 한다. 허락을 구해야 대입할 수 있다.

float a = (float)3.14;
int b = (int)3.14;

이렇게 용서를 구하면 비로소 컴파일 에러가 사라진다.

float a = 3.14f;
a += 3.04;

근데 이건 된다. 개미친언어 시즌 2. 복합대입연산자는.. 암묵적 캐스팅이 된댄다. 알아두자.

byte, short, int, long, float, double 순서다.

그러면 short에 int를 넣으면 컴파일 오류가 나야 한다.

short a = 3;

근데 안난다. 개미친언어 시즌 3. 컴파일러가 미리 계산해둘 수 있는 정수형 리터럴은 암묵적 캐스팅이 적용된댄다. 진짜 이젠 나도 모르겠다.

short a = 2 + 5;

뭐 대충 이 정도는 알아서 처리해준댄다.


연결된 페이지 (Inlinks)

연결된 페이지가 없습니다.


댓글 쓰기, GitHub에서 보기