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);
}
}
참고
자바의정석
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 |