JAVA/Java 기초

2의 보수법

n비트의 2진수로 표현할 수 있는 값의 개수 → 2의 n승 

→ 4비트의 2진수 = 16개  = (부호없는 정수)0부터 15까지의 정수를 나타낼 수 있다.

 

양수의 첫 번째 비트만 1로 바꾸면 음수가 되지만, 두 수를 더했을 때 2진수로 0이 되지 않는다. 그리고 0이 두 개(0, -0)존재하게 된다.

 

2의 보수법에 의해 음수를 배치하면, 모순이 없어진다.

'n의 보수' : 더했을 때 n이 되는 수

'2의 보수법' : 두 2진수로 절대값이 같고 부호가 다른 두 10진수를 표현한것 → 부호있는 정수를 표현한다.

 

간단하게 '2의 보수'를 구하는 방법

2의 보수 = 1의 보수 + 1

'1의 보수'는 0을 1로, 1을 0으로 바꾸면 된다.

→ 2진수에 1의 보수를 더하면 모든 자리가 1이 된다. → 양 변애 1을 더하면 우변은 0이 되고, 올림 되지만 4비트를 넘게되어 저장할 공간이 없어 버려진다. → 어떤 수에 '1의 보수 +1'을 더하면 0이 되므로 '1의 보수 +1'은 '2의 보수'와 같다.

 

음수의 2진 표현 구하는 방법
① 음수의 절대값을 2진수로 변환한다.
    : -5 → 5의 2진수 '0101'
② ①에서 구한 2진수의 '1의 보수'를 구한다.
    : '0101' → '1010'
③ ②의 결과에 1을 더해 '2의 보수'를 구한다.
    : '1011' = -5의 2진 표현

 

 

  • 표현할 수 있는 수의 범위가 넘어가면 어떻게 표현될까?
  • (byte)227 은 왜 -29로 나타날까
/*
 * byte는 8비트, 
 * 8비트의 2진수로 표현할 수 있는 값의 개수-> 2의 8승
 * -> 256개 = (부호없는 정수) 0부터 255까지의 정수를 나타낼 수 있다.
 * -> =128 ~ 127까지의 범위를 가진다.
 * 
 * 답인 227은 범위를 넘어가게 된다. -> 오버플로우 발생
 */
public class PageEtc {
	public static void main(String[] args) {
		byte b = 127;
		int i = 100;
		int sum = b+i;
		System.out.println((byte)(sum));	//227이 아니라 -29가 나온다
		
		String binaryString = Integer.toBinaryString(sum);	// -29를 2진수로 바꾸면 11100011
		System.out.println(binaryString);
		
		byte c = 29;
		String bs1 = Integer.toBinaryString(c);		// -29의 2의 보수는 11101 이 된다. 
		System.out.println(bs1);
		int binaryToDecimal = Integer.parseInt(bs1, 2);	//이를 다시 10진수로 바꾸면 29.
		System.out.println(binaryToDecimal);
	}
}

 

 

 

 

 

참고

자바의정석

1의 보수와 2의 보수를 이해하자!

1의 보수

728x90
728x90

'JAVA > Java 기초' 카테고리의 다른 글

Stack  (0) 2022.06.02
List 인터페이스 - ArrayList 클래스  (0) 2022.06.02
자바 이론 복습용 정리  (0) 2022.05.31
List 인터페이스 - Vector 클래스  (0) 2022.05.30
컬렉션 프레임워크 - collection  (0) 2022.05.30