본문 바로가기
Programmer/Great Code(책)

2장 수치표기법

by 손정빈 2017. 1. 3.
728x90
반응형

이 내용은 Great Code를 읽고 다시 한번 반복을 하기 위해서 작성한 글이다.


2장 수치표기법


수치표기법을 이해하게 되면 좀 더 많은 알고리즘을 효율적으로 구현할 수 있게 된다.




1. 수란 무엇인가?


과연 수란 무엇인가? 사실 수라는 개념은 조금 추상적이다.


예를 들어 이 책은 100장 정도 될꺼야.. 라는 말을 보면


사실 이 책은 정확히 100장은 아니다. 하지만 책을 추상적으로 크기를 표현 한 것이다.


수는 추상적이며, 개념적이고, 또한 양을 나태내는 지적 도구이다.


그렇다면 이번 장에서 말하는 수치표기법은 무엇인가?


간단하게 말해 수를 표시하는 방법을 말한다


예를 들어 2진법, 10진법, 16진법 같은 수를 표현하는 방법이다.


이러한 수치표기법에 따라 실제로 100이라는 글자가 100을 의미 할 수도 4를 의미할 수도 있게 된다.




2. 수 체계


수 쳬계란 수의 값을 표현하는 메카니즘이다.


오늘 날 실생활에서는 대부분 10진법을 사용한다. 하지만 컴퓨터에서는 2진법을 사용하고 있다.


그러기에 프로그래머라면 10진법과 2진법을 혼돈하여서 프로그램을 짜게 된다면 그다지 좋지 못한 프로그램이 만들어 질 것이다.


이러한 수체계에서도 종류가 나눠지는데  위치표기법과 비위치표기법으로 나눠진다.


비위치표기법의 경우 위치를 상관하지 않기때문에 수를 표현하기에 많은 공간을 차지하게 된다.


하지만 위치표기법은


123.45의 경우 1*100, 2*10, 3, 4/10, 5/100 과 같이 큰 양의 수를 적은 공간에 표시할 수 있다.


2-1 기수


인간은 자신의 손을 보면서 10진법을 개발하였는데 사실 10진법이 유일한 위치표기법은 아니다. 또한 컴퓨터 입장에서도 좋은 수체계는 아니다.


기수란 왼쪽으로 한자리씩 이동할때마다 곱해지는 수를 의미한다.


10진법의 경우 10이 기수이며


2진법의 경우 2가 기수이다.





3. 수치/문자열 변환


프로그래밍을 할 경우 대부분 변환이 발생한다.


그러한 변환 과정을 이해해두고 실제로 우리가 글을 입력 할 경우 변환이 발생한다는 걸 알아야한다.


왜냐하면 이러한 변환과정 자체가 시간과 에너지를 소모하기 때문에 이러한 과정을 이해하고 알고 있다면 좀 더 좋은 소스를 작성할 수 있을 것이다.



4. 내부 수치 표현법


현대 컴퓨터 시스템은 2진법 체계를 사용하므로 수치나 다른 대상을 표현하기 위해서는 내부의 2진법 포맷을 사용하게 된다.


그러기에 최고의 코드를 짜기 위해선 컴퓨터 내부에서 효율적으로 데이터를 사용할 수 있도록 해야한다.


4-1 비트


2진법을 사용하는 컴퓨터에서 가장 작은 단위는 바로 비트이다.


하나의 비트는 오직 2개의 수만을 나타낼 수 있다.


더 큰 수를 표현 하기 위해선 비트를 묶어 사용하는데 이걸 비트 스트링이라고 한다.


4-2 비트 스트링

 

비트스트링에 대한 단위를 간단하게 알아보자


우선


니블(nibble) : 4개의 비트를 모아 놓은 것이다. 실제로 컴퓨터에서 매모리를 니블 단위로 접근하는 것은 효과적이지 않다. 하지만 16진수를 표현 할 수 있다는 점에서 의미가 있다.


바이트(byte) : 8개의 비트를 모아 놓은 것이다. 많은 CPU에서 접근 가능한 가장 작은 단위로 사용되고 있으며, CPU는 메모리로부터 8비트 단위의 정볼르 효율적으로 읽고 쓸수 있다. 그리고


비트 0은 가장 낮은 순위(Low order)

비트 1은 가장 높은 순위(High order)이라고 한다.


워드(word) : CPU에 따라서 다른 의미를 가지고 있다. 어떤 CPU는 16비트, 어떤 CPU는 32비트 또는 64비트를 의미한다. 하지만 본 Creat Code에서 말하는 80x86에서는 16비트를 의미한다.



위의 그림 처럼 구성 되며 15~8은 HO 바이트

7~0은 LO바이트라고 한다.


롱(long) : 32비트를 가르키며 HO바이트 + 바이트 # 2 + 바이트 # 1 + LO 바이트로 구성된다. 또는 HO워드, LO워드로 구성된다




5. 부호 있는 수와 부호 없는 수


컴퓨터 상에서 음수 또한 2진법을 통해 나타내게 된다.


2의 보수쳬계를 통해 나타낼 경우 HO를 부호 비트로 사용하게 된다.


HO 비트가 0이면 양수, 1이면 음수이다.




6. 주호 확장, 0 확장과 축소


현대의 많은 프로그램 고급 언어들은 서로 다른 크기의 여러 정수포맷을 제공한다. 렇다면 하나의 수식에 서로 다른 포맷을 가진 피연산자가 있을 경우는 어떻게 될까?


어떤 언어는 에러를 보내고, 어떤 언어는 스스로 동일한 포맷으로 변환하여 처리한다.


하지만 동일한 포맷으로 변환이 될 경우 비용이 들게 된다.


그러기에 최고의 코드를 만들기 위해서는 이런 변환과정 또한 이해를 하고 있어야한다.


예를 들어 확장의 경우


부호가 있을 경우

8비트에서 16비트로 변환 할 때 HO비트로 나머지 15~8비트를 채워준다.

부호가 없을 경우

나머지를 다 0으로 채워준다.


축소는 간단하다.  하지만 축소의 경우 문제점이 발생하게 된다. 그것은 바로 절단 오차다.


절단 오차랑 음료수 100개를 담을 수 있는 가방에서 음료수 80개를 담을 수 있는 가방에 옮기게 된다면 실제로 20개는 버려지게 될 것이다. 이 버려짐으로써 발생하는 오차가 절단 오차이다.


큰 포맷에서 작은 포맷으로 축소할 경우 이와 같은 절단오차를 유의 해야 한다.





7. 포화


포화는 정말 간단하다. 수용 가능한 양이상의 데이터를 넣을 경우 수용가능한 최대 값을 넣어주는 방식이다





8. 2진화 10진 표기법(BCD)


2진화 10진(BCD) 포맷은 그 이름이 말해주듯 2진 표기법을 이용해 10진법을 코딩하는 방법이다.


하나의 니들(4비트)을 한자리로 인식하고 나타내는 방법이다.


하지만 BCD표기법은 그리 효율적이지 못하다. 2진법으로 8개의 비트가 있다면 256개의 숫자를 표시 할 수 있지만 BCD는 100가지밖에 나타낼수 없기 때문이다.


그렇다면 왜!!! BCD표기법을 사용하는 걸일까?


우선 2가지 장점이 있다.


1. 10진수로의 변환이 쉽다.

2. 하드웨어에서 여라 자리의 10진수를 인토딩할 때 편리하다.


위의 장점 때문에 아직까지 BCD를 사용하는 부분이 있다.





9. 고정소수점 표기


지금까지 정수값 표기에 대해서만 이야기했다. 그렇다면 이제 소수점 이하의 값은 어떻게 나타낼 수 있을지 이야기 해보자.


표기 방법에는 고정 소수점과 부동 소수점이 존재한다.


고정소수점은 소수점을 사용하여 고정된 자리수의 소수를 나타내는 것으로 한정된 메모리에서 부동 소수점 방식보다 좁은 범위의 수만 나타낼 수 있다.









반응형

댓글