[TIL] CSAPP 2.3장 키워드

zxcv·2025년 5월 24일

2.3 정수의 산술 연산

2.3.1 비 부호형 덧셈

자료형이 가지는 최대값을 초과하는 연산 시 overflow가 발생해 원하지 않는 값을 갖게 된다.
예) 1101 + 1001 = (1)0110
이것은 mod 연산과 동일한 값을 도출 한다고 함

2.3.2의 보수 덧셈

2의 보수방식은 0의 표현이 하나뿐.
1의 보수방식에서 발생하는 +0,-0의 중복 문제가 없음
비 부호형과 마찬가지로 최대값을 초과흔 연산 시 overflow 발생.

덧셈만으로 뺄셈을 구현이 가능
예) A-B(B의 보수)
1의 보수와 달리 0의 표현이 하나
오버플로우 판별이 간단 (최상이 비트가 변할 때)

2.3.4 비부호형 곱셈

오버플로우: 곱셈 결과가 타입이 표현할 수 있는 최대값을 넘으면, 상위 비트는 버려지고 하위 비트만 저장. 즉, 오버플로우가 발생해도 오류가 나지 않고, 결과값은 모듈러 연산(나머지 연산)처럼 동작
예) 8bit unsigned에서 200 x 4 = 800을 계산하면, 8비트로 표현 가능한 최대값은 255이므로, 실제 저장되는 값은 800 mod 256 =32

2.3.6 상수를 사용한 곱셈

  1. 상수의 곱셈의 기본
  • 어떤 정수 x에 상수 k를 곱하느 연산, 즉 x*k는 컴퓨터에서 자주 등장
  • 곱셈 연산은 덧셈이나 시프트 연산보다 상대적으로 느릴 수 있습니다.
  1. 시프트와 덧셈으로 변환
  • 상수가 2의 거듭제곱(2,4,8,16) 이라면 곱셈을 비트 시프트로 대체가 가능
    - 예) x*8 -> x << 3 (왼쪽을 3비트 이동)
  • 상수가 2의 거듭제곱의 합으로 표현될 수 있다면, 곱셈을 여러 번의 시프트와 덧셈으로 바꿀 수 있음
    • 예 x 14 -> x (8+4+2+1) -> ( x << 3) + ( x << 2 ) + (x << 1) + x

4.최적화의 이유
CPU는 시프트와 덧셈 연산을 곱셈보다 훨씬 빠르게 처리

컴파일러는 상수 곱셈을 자동으로 시프트와 덧셈으로 최적화하는 경우가 많음.

profile
일단함

2개의 댓글

comment-user-thumbnail
2025년 5월 24일

요새 이것만공부하니 꿈에 이진수 나올것같다

1개의 답글