Jake Seo
제이크서 개발 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (719)
    • AI 서비스 개발 일기 (3)
    • LLM 개발 일기 (1)
    • ------레거시 (2025.08.23 이전)--.. (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바 디자인패턴
  • 추상 팩터리 패턴
  • 도커공식문서
  • 싱글톤 패턴
  • 이펙티브 자바 item9
  • 슬로우 쿼리
  • 플라이웨이트패턴
  • item7
  • 디자인패턴
  • Next.js
  • 이펙티브자바
  • 객체복사
  • rust
  • 자바 검증
  • 이펙티브 자바
  • 프로그래머의 뇌
  • pnpm
  • 자바
  • serverless computing
  • 느린 쿼리
  • Javadoc 자바독 자바주석 주석 Comment
  • Pre-rendering
  • 자료구조
  • item8
  • 자바스크립트 면접
  • 빈 검증
  • 서버리스 컴퓨팅
  • 싱글톤
  • item9
  • 참조 해제
  • 러스트
  • 메이븐 골
  • 알고리즘
  • bean Validation
  • next js app
  • 싱글턴
  • MSSQL
  • 외래키 제약조건
  • 자바스크립트
  • 메이븐 라이프사이클
  • try-with-resources
  • 스프링 검증
  • 메이븐 페이즈
  • Java
  • 토비의 스프링
  • 팩터리 메서드 패턴
  • 자바스크립트 인터뷰
  • prerendering
  • 작업기억공간
  • NEXT JS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 개발 블로그

용어 (개발용어)

2의 보수란?

2023. 3. 18. 02:24

보수 기초 개념 익히기: n 의 보수란?

  • n 진수를 표현할 때 n 의 제곱이 되기 위해 더해주는 수

10 진수로 예제 들어보기

  • 13 에 대한 10 의 보수는 87 이다.
    • 가장 가까운 n 의 제곱이 100 이다.
  • 133 에 대한 10 의 보수는 867 이다.
    • 가장 가까운 n 의 제곱이 1000 이다.

n-1 의 보수 구해보기

  • n-1 의 보수는 n 의 보수에서 1 을 빼면 된다.
  • 즉, 133 의 9 의 보수는 866 이다.

n-1 의 보수는 왜 구하는가?

  • n-1 의 보수를 구하는 법은 알겠는데 왜 구하는지에 대한 감을 잡긴 어렵다.
  • 8 진법에서 423(8) 의 8 의 보수를 구하려면 어떻게 해야 할까?
    • 1000(8) = 423(8) + x(8) 여기서 x 를 구해야 한다.
    • 여기서 우리는 자릿수의 변화와 또 익숙치 않은 8 진수라는 숫자를 다루게 되어 머리가 복잡해진다. 더 쉽게 구하는 방법이 없을까?
    • n-1 의 보수를 구하면 더 쉽다.
    • 777(8) - 423(8) 을 하면 된다. 마치 10 진수처럼 계산할 수 있어서 10 진수를 써온 인간에게 훨씬 친숙한 계산이 가능하다.
    • 354(8) 이 나온다.
      • 우리가 구한 것은 n-1 의 보수이니 이것은 7 의 보수이다.
    • 여기서 1 을 더해주면 우리가 얻고싶어 했던 8 의 보수가 나온다.
      • 355(8)

즉, 인간이 다양한 진법의 n 의 보수를 더 쉽게 구하려고 n-1 의 보수를 쓰게 된다.

2의 보수란?

  • 2진수에서 한정된 비트로 부호가 있는 수를 표현할 때 사용하는 도구이다.
  • 맨 앞의 비트를 부호로 사용한다.
    • 0: 양수, Positive, 1: 음수, Negative

2의 보수 표현 범위 구하기

  • 부호가 있는 숫자 데이터에서 음수를 표현하기 위해 주로 사용한다.
    • 2의 보수를 이용해 회로를 간단하게 만들 수 있기 때문이다.

n 비트를 가진 데이터 타입에서 음수를 표현하는 방식

  • 4 비트로 숫자를 표현한다고 가정하면, 0000 ~ 1111 까지 숫자를 표현할 수 있다.
    • 총 16 가지 종류의 숫자 표현이 가능하다.
    • 0과 양수는 0~7 까지의 8개의 범위를 갖는다.
    • 음수는 -1~-8 까지의 8개의 범위를 갖는다.
      • 이 음수 범위를 2의 보수로 표현한다.

4비트에서 2의 보수 양수 표현하기

  • 양수는 일반적인 2진수와 똑같이 표현하면 된다.
  • 7 을 표현하고 싶다면 0111 이다.

4비트에서 2의 보수 음수 표현하기

  • 음수에서 7 을 표현하고 싶다면 2진수 7 에서 1의 보수 를 구하고 +1 을 하면 된다.
  • 0111: 7
  • 1000: 7의 1의 보수
  • 1001: 7의 2의 보수
  • 1001 이 -7 을 표현하게 된다.
  • 그런데 2의 보수로 표현된 1001 이 -7 인 것을 알고 싶다면, 다시 2의 보수를 역산해야 한다.
  • 1001 -> 0110 -> 0111 이렇게 -7 인 것을 알 수 있다.

2의 보수를 이용해 숫자 더해보기

2의 보수로 음수를 표현하는 것의 장점은 회로에서 덧셈만 구현하면 뺄셈까지 구현이 가능하다는 점이다.

0 이 나오는 케이스

아래는 3 의 음수인 -3 을 이용해 덧셈으로 뺄셈을 구현한 예제이다. 0 이 나오는 케이스를 먼저 다루는 이유는 결과값을 2의 보수로 역산해보지 않아도 쉽게 맞았다는 것을 알 수 있기 때문이다.

  • 0011 (3)
  • 1101 (-3)
  • 0000 (0)

0 이 나오지 않는 케이스

0 이 나오지 않는 케이스는 결과의 실제 10진수 값을 알기 위해서 2의 보수로 역산을 한번 해보아야 한다.

  • 0101 (5)
  • 1001 (-7)
  • 1110 (-2)
  • 1110 -> 0001 -> 0010 (2)

역산 결과 정답을 올바르게 구한 것을 알 수 있다.

정리

  • n 비트로 숫자를 표현할 때 양수와 음수를 모두 표현하고 싶다면, 보통 음수를 2 의 보수로 표현한다.
  • 2 의 보수를 쉽게 구하기 위해서 1 의 보수를 먼저 구하고 +1 을 한다.
  • 2 의 보수를 이용해 음수를 표현하면, 오직 덧셈 회로만을 이용해 뺄셈까지 구현이 가능해진다.

레퍼런스

https://st-lab.tistory.com/189

저작자표시 비영리 (새창열림)

'용어 (개발용어)' 카테고리의 다른 글

프로그래밍 언어에서 말하는 의미론 (Semantics, 시멘틱) 이란?  (1) 2023.03.25
빅 엔디언 (big endian) 과 리틀 엔디언 (little endian) 이란?  (0) 2023.03.18
IEEE 754 부동소수점이란?  (0) 2023.03.17
클램프 (Clamp) 란? feat. 컴퓨터 과학, 그래픽스 용어  (0) 2023.03.15
UTF (Unicode Transformation Format) 인코딩이란?  (0) 2023.03.10
    '용어 (개발용어)' 카테고리의 다른 글
    • 프로그래밍 언어에서 말하는 의미론 (Semantics, 시멘틱) 이란?
    • 빅 엔디언 (big endian) 과 리틀 엔디언 (little endian) 이란?
    • IEEE 754 부동소수점이란?
    • 클램프 (Clamp) 란? feat. 컴퓨터 과학, 그래픽스 용어
    Jake Seo
    Jake Seo
    ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바