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)
연결된 페이지가 없습니다.