16비트와 2의 보수는 왜 있는거임 [CSAPP Chap 2]

CSAPP의 2장의 초반부를 알아보는 시간이다. 이번 내용은 의외로 대학 1학년 과목이랑 비슷한 난이도 수준인데, 꼬아서 내면 대응이 쉽진 않을 것 같다. 이런거까지 이해해줘야하는 컴퓨터를 받아줘야 또 나중에 LLM도 잘 쓰고 MCP도 잘쓰지 않을까?


컴퓨터는 0과 1로 모든걸 표현한다는데 16진수 같은거 왜 있나요?;

  • 2의 4승이니, 1010을 "A"로 바꾸듯 같은 길이라면 더 많은 내용을 담을 수 있다.
  • 사람의 10진수에 알파벳을 붙였어서 10진수의 Extension Pack 같은 것이다. 보다보면 보인다 보여!가 가능해진다.

 

10진수에 알파벳 들어가는게 됐으면 아주 32진수도 하지 그랬어요. 0 - 9에 A - Z도 다 들어가네?

  • umm.. 2^5니까 5비트씩 묶어서 표현해야한다. (16진수가 4비트 단위로 한 글자를 만들었듯) 그럼 다 꼬인다.

 

이러한 내용을 거쳐, 인간이 2진수를 다루는 가장 편리한 '축약어'가 되었다.

어쨌든, 16진수는 데이터를 처리하는 기본 단위인 바이트와 궁합이 완벽하게 들어맞기 때문이었다.

 

8 Bai tu (8 바이트)

노래도 8박자에 타면 재미쓴데, 공학적 냄새가 나는 숫자는 역시 8이 아닐까?

  • 1바이트의 unsigned char를 선언하면 0 - 255까지 총 256개의 수를 저장 할 수 있다.
  • signed로 했다간 맨 왼쪽 숫자boolean isMinus; 가 되기 때문에 127로 표현 가능한 절댓값은 줄어든다.

 

이대론 못쓴대요 : 왜요?

  • 계산이 복잡해진다 : 덧셈을 시도 할 때 부호 비트를 별도 처리해야 하기 때문에 덧셈 회로가 복잡해진다.
  • 0이 2개가 된다 : 00000000 과 10000000은 각각 +0과 -0이다. 이게 맞냐? 큰 혼란이 발생한다.

 

2의 보수

천재적 방법인 2의 보수를 소개한다. 주어진 모든 비트를 flip 하고 +1 을 더하면 끝이다. -5를 시도해보자.

000001011111101011111011

  • 1바이트 기준에 255가 최대 값인 자료형 기준에선 그냥 251 아닌가요?
    • 얘가 -5인지, 251인지는 데이터 타입에서 결정된다. 11111011만 써서는 아무 의미가 없다.
      프로그래머가 제공하는 문맥에 따라 비트에 의미부여가 이루어진다는 것이다.
  • 그래서 못쓰는 이유들을 어떻게 해결? 하나요?
    • 8비트에서 00000000에 2의 보수 규칙을 적용하면
    • 11111111 + 1 = 1 00000000
      • 이 때 9번째 비트가 만들어졌지만 버린다. 이걸 오버플로우라고 한다. 왜냐하면 1바이트만 다루고 있기 때문이다.
      • 그래서 여전히 0이라서, 드디어 0은 00000000이다.
    • 다른 예제인 5와 -5를 더해보자. 각각 00000101 그리고 11111011 이다. 그냥 더하면 끝!

실제 사용하는 계산 방법과 달리 정말 사기다. 편입 할 때 공부한 로피탈 정리 꼼수가 생각나는 수준이다. 실제 이점은 :

  • 덧셈기 하나로 뺄셈이 가능해졌다. 5 - 5는 5 + (-5)랑 같기 때문이다.
  • 하나의 0을 표기하는 덕분에 혼란이 없다.