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를 시도해보자.
00000101 - 11111010 - 11111011
- 1바이트 기준에 255가 최대 값인 자료형 기준에선 그냥 251 아닌가요?
- 얘가 -5인지, 251인지는 데이터 타입에서 결정된다. 11111011만 써서는 아무 의미가 없다.
프로그래머가 제공하는 문맥에 따라 비트에 의미부여가 이루어진다는 것이다.
- 얘가 -5인지, 251인지는 데이터 타입에서 결정된다. 11111011만 써서는 아무 의미가 없다.
- 그래서 못쓰는 이유들을 어떻게 해결? 하나요?
- 8비트에서 00000000에 2의 보수 규칙을 적용하면
- 11111111 + 1 = 1 00000000
- 이 때 9번째 비트가 만들어졌지만 버린다. 이걸 오버플로우라고 한다. 왜냐하면 1바이트만 다루고 있기 때문이다.
- 그래서 여전히 0이라서, 드디어 0은 00000000이다.
- 다른 예제인 5와 -5를 더해보자. 각각 00000101 그리고 11111011 이다. 그냥 더하면 끝!
실제 사용하는 계산 방법과 달리 정말 사기다. 편입 할 때 공부한 로피탈 정리 꼼수가 생각나는 수준이다. 실제 이점은 :
- 덧셈기 하나로 뺄셈이 가능해졌다. 5 - 5는 5 + (-5)랑 같기 때문이다.
- 하나의 0을 표기하는 덕분에 혼란이 없다.
'컴퓨터 이론 > CS:APP' 카테고리의 다른 글
어 셈블리 어 를 논하겠 어 (+ 레지스터) [CSAPP Chap 3] (5) | 2025.08.27 |
---|---|
부동소수점과 엔디안 논하기 [CSAPP Chap 2] (0) | 2025.08.21 |
운영체제의 추상화를 정돈해보니 [CSAPP Chap 1] (5) | 2025.08.15 |
컴퓨터가 프로그램을 실행하는 과정 [CSAPP Chap 1] (4) | 2025.08.15 |
bit에 몸을 맡기다 (하드웨어에서의 버스) [CSAPP Chap 1] (3) | 2025.08.15 |