혼자 공부하는 컴퓨터 구조 & 운영체제 Chapter 1~3

김지승·2025년 1월 12일

CS

목록 보기
6/22

int (32-bit)

1개의 부호 비트와 31개의 값 표현 비트로 이루어져 있다.
최대값은 2^32-1
최소값은 -2^32

의문점 : 1개가 부호고 31개가 값이면 -(2^32-1)~2^32-1까지 아니야??
-> 2의 보수를 이용하여 저장하기때문에 최소값이 -2^32까지이다.

  • 보수방식 (0010의 음수표현)
    • 1의 보수 사용(1101)
      ex1)
      ex2)

장점 : 사람이 볼 때 MSB만 보고 양수, 음수를 파악할 수 있어 직관적이다.
단점 : 0을 표현하는 방법이 2가지가 있다. 셈을 할 때 고려해야 할 것이 많아지고 회로가 복잡해진다.

  • 2의 보수 사용(1100)
    ex1)
    ex2)

    장점 : 1의 보수에 1을 더하면 음수 값을 얻을 수 있다. 덧셈만으로 뺄셈을 구현할 수 있어 회로가 단순해진다. 1의 보수의 단점이 모두 해결된다. ( 0이 2개인 문제, 캐리 값에 따라 셈을 추가로 해줘야 하는 문제 )

float

1개의 부호비트와 8개의 지수비트 23개의 가수비트로 이루어져 있다.

double

1개의 부호비트와 11개의 지수비트 52개의 가수비트로 이루어져 있다.

수 저장 방식

(가수부분)×2(지수부분)(가수부분)\times2^{(지수부분)}
형태로 수를 저장하는 방법.
지수부분은 -127의 bias를 갖고, 가수부분은 항상 1로 시작한다.
최댓값은
최솟값은 (MIN_VALUE 이지만 절대적인 최솟값이 아니라 가장 작은 표현 단위)

※ 예외사항

지수부분은 00000001부터 11111110까지만 사용한다 (-126~127)

  • 255는 INF와 NaN을 표현한다.
    11111111에서 가수부분이 0이면 INF, 0이아니면 NaN
  • 0은 0을 정교하게 표현하기 위해 사용한다.
    기존의 가수부는 1로 시작하기 때문에 0표현이 불가능한데, 이를 위해 00000000의 경우에는 가수부분이 0부터 시작한다.

이진수 변환 방식

0.1을 이진수로 표현하면 다음과 같이 반복되는 이진수가 됩니다:

즉, 0.1을 이진수로 정확하게 표현하는 것은 불가능하며, 항상 일정한 비율로 반복되는 값이 됩니다.

따라서 위와 같은 이유로 double의 0.1과 0.2를 더하면 0.3이 아닌값이 된다.

극복

  • 정수로 변환

    10의 거듭제곱을 곱해서 정수로 변환해놓고 사용한다.

  • BigDecimal 사용

import java.math.BigDecimal;

public class BigDecimalArithmetic {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("100.25");
        BigDecimal num2 = new BigDecimal("99.75");

        // 덧셈
        BigDecimal sum = num1.add(num2);
        System.out.println("합: " + sum);  // 200.00
        }
    }
}
profile
디등

0개의 댓글