Skip to content

Instantly share code, notes, and snippets.

@dobestan
Last active August 29, 2015 13:57
Show Gist options
  • Save dobestan/9866102 to your computer and use it in GitHub Desktop.
Save dobestan/9866102 to your computer and use it in GitHub Desktop.
@안수빈
class SB1 {
public static void main(String[] args) {
int x = 2;
int y = 5;
if ( ( x > 3 ) && ( y < 2 ) | doStuff() )
// 일단 &&와 &의 차이는 얼마나 연산에 최적화가 되어있는가에 대한 차이인데,
// &&(AND)가 같은 경우에는 앞의 x && y가 x가 거짓이면 절대로 참일 수가 없기 때문에 y를 보지도 않고 그냥 넘어감
// &(AND)같은 경우에는 그래도 끝까지 실행은 시키는거라고 생각하면 된다.
// 첨부한 이미지 참조
// 연산자 우선순위에 의해서 &&가 | 보다 먼저 실행되는데
// ( x > 3 )이 false이므로 뒤의 조건들을 보지 않고 false를 리턴한다.
//
// 즉 연산의 수행은 else block을 수행한다.
System.out.println("true");
else
System.out.println("false");
}
static boolean doStuff() {
System.out.println("exec");
return false;
}
}
class SB2 {
public static void main(String[] args) {
System.out.println((int)(char)(byte)-1);
// 일단 굉장히 쉽게 알 수 있는 내용
// 1. -1만 있는 경우는 그냥 출력된다.
// 2. (byte)-1 은 int -> byte type casting 이 발생한다. 출력결과는 -1
// - 이 경우는 큰 사이즈에서 작은 사이즈로의 타입 캐스팅
// - 즉 앞의 숫자들이 버려짐
// - 현재의 상태는 1111 1111 (-1)
//
// 3. (char)(byte)-1 은 int -> byte -> char type casting이 발생
// - 출력 결과는 이상한 문자가 출력된다. -1을 유니코드로 출력한 결과값
// - 여기서 문제가 발생하게 되는데 type casting이 8bit -> 16bit로 작은 사이즈에서 큰 사이즈로의 캐스팅이 발생한다.
// - 원래 작은 사이즈에서 큰 사이즈로의 캐스팅은 앞의 sign bit(부호비트, 맨 앞의 1bit)를 복사해서 채워넣는다.
// - 즉 1을 채워넣어 아래와 같은 상태가 된다.
// - 현재 상태 : 1111 1111 1111 1111 (-1)
//
// 4. (int)(char)(byte)-1는 int -> byte -> char -> int type casting이 발생
// - 출력결과는 65535가 출력된다.
// - 현재 상태 : 0000 0000 0000 0000 1111 1111 1111 1111 (65535)
// - 여기서 앞이 1로 채워지지 않고 0으로 채워지는 이유는 유니코드 -1이 실제로는 존재하지 않는 값이기 때문이다.
}
}
// 이 문제는 2진수로 출력해보면 굉장히 쉬운 문제인데 한번 생각해보자.
// 2의 보수 표현에 대해서는 이미 알고 있다고 가정한다.
//
// 기본 지식 몇 가지는
// - int : 32bit = 4byte
// - char : 16bit = 2byte
// - byte : 8bit = 1byte
@dobestan
Copy link
Author

@dobestan
Copy link
Author

http://sycooljava.blogspot.kr/2013/08/chap2.html

자바 연산자 우선순위표 한번 쭉 읽어보기
특히 && & || | 을 구분하기

  • 시험문제로 출제되기 굉장히 좋은 문제

@dobestan
Copy link
Author

SB2에 대한 실행과정 및 이해는 아래의 링크를 참조할 것

https://www.evernote.com/shard/s212/sh/5f2a3ac4-c4d2-4b2b-a976-2a32fd69c093/1d709254d1b6da86d641bd1395e3b69c

@dobestan
Copy link
Author

과정4에 대한 추가적인 설명

  • 유니코드 값은 항상 양의 값을 갖는다.
  • 즉 javac(java compiler)는 char는 항상 양의 값 0-65535를 갖는다고 생각한다.
  • 즉 실제로 우리가 의도했던 -1(1111 1111 1111 1111)을 음수를 2의 보수로 표현한 값이 아니라 이진법으로 65535를 표현한 것으로 판단한다.
  • 따라서 char -> int의 형변환이 일어날 때, 앞의 부호비트를 복사하지 않고 0(positive sign bit)으로 채워넣는다.
  • 즉, 우리가 의도하지 않았던 0000 0000 0000 0000 1111 1111 1111 1111 (65535)가 출력된다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment