1장 컴퓨터 내부의 언어 체계
프로그래머는 컴퓨터에게 명령을 내리는 일을 하며, 컴퓨터가 사람의 말을 알아듣지 못하기 때문에 사람이 컴퓨터의 말(기계어)를 배워야 한다. 기계어는 인공적인 발명품이며 문자 언어만 사용한다
문자 언어 : 기호를 나열한 것
문자 언어의 세가지 구성요소
기호가 들어갈 상자
상자에 들어갈 기호
상자의 순서
자연어에서는 이 상자를 문자(character)라고 부르고컴퓨터에서는 비트(beat)라고 부른다
비트(beat) : 2진수(binary) + 숫자(digit) 의 합성어
비트는 2진법을 사용하며 비트상자에 두가지 기호중 하나만 담을 수 있다
비트의 사용법 중 하나는 참(true)과 거짓(false)으로 표현하는 것인데
다른 비트들이 표현하는 내용으로부터 새로운 비트를 만들어내는 동작을 논리 연산(logic operation)이라고 한다
- 논리연산의 예
“밖에 비가 내리고 있거나 춥다면 코트를 입어라” 라는 지문이 있을 때,
”비가 내리고 있는가?” 가 참이거나 “추운가?” 가 참이라면 “코트를 입는다” 가 참이다
→ 다른 비트들이 표현하는 내용으로부터 새로운 비트를 만들어내는 동작
불리언 대수 : 영국 수학자 조지 불이 만들었으며 비트에 대해 사용할 수 있는 연산규칙의 집합
- NOT : 논리적 반대. 입력의 상태를 반대로 반전
거짓인 비트에 NOT → 참
참인 비트에 NOT → 거짓 - AND : 둘 이상의 비트에 작용.
첫번째 비트가 참이고 두번째 비트도 참일때 → 참
더 많은 비트에 연산을 적용하는 경우 모든 비트가 참이면 → 참 - OR : 둘 이상의 비트에 작용.
첫번째 비트가 참이거나 두번째 비트가 참이면 → 참
더 많은 비트에 연산을 적용하는 경우 어느 한 비트라도 참이면 → 참
드모르간의 법칙
: a AND b == NOT(NOT a OR NOT b) → 연산을 최소로 사용하면 비용을 최소화할 수 있다
양의 정수 표현
비트를 사용하며 2를 밑으로 하는 2진수 체계
2진수에서 가장 오른쪽의 비트를 LSB(가장 작은 유효 비트), 가장 왼쪽의 비트를 MSB(가장 큰 유효 비트)라고 한다
2진수 덧셈
10진 덧셈처럼 2진수에서도 각 비트를 LSB에서 MSB 쪽으로 더하며 결과가 1보다 크면 1을 다음자리(왼쪽)로 올린다
두 비트를 서로 더한 결과는 두 비트를 XOR 한 값과 같고, 올림은 두 비트를 AND 한 값과 같다
덧셈 결과가 사용할 비트의 개수로 표현할 수 있는 범위를 벗어나면 오버플로(Overflow)가 발생한다
음수 표현
부호에는 양부호(+)와 음부호(-)가 있으며 가장 왼쪽 비트(MSB)를 부호에 사용한다
한 비트를 부호에 사용하고 나머지 비트를 수의 크기, 즉 0부터의 거리(절댓값)를 표현하기 위해 사용하는 방법을
부호와 크기 표현법 이라고 한다
부호와 크기 표현법의 단점
1. 0을 표현하는 방법이 두가지라 비용 낭비
2. XOR과 AND를 통한 덧셈계산 사용 불가능
또 다른 방법으로 양수의 모든 비트를 뒤집는 1의 보수 표현법이 있다
비트들을 부호비트와 나머지로 나눈 뒤 NOT 연산을 통해 보수를 얻는다
1의 보수 표현법 단점
1. 0을 표현하는 방법이 두가지라 비용 낭비
2. 덧셈을 할 때 순환 올림이라는 특수한 처리방식을 사용해야하기 때문에 비용이 더 들음
2의보수 표현법
부호가 있는 정수를 표현할 때 가장 널리 쓰이는 방법
1을 더했을 때(+0001) 0이 나오는 비트 패턴( 1111)을 찾고 이 패턴을 -1로 정하는 방식
우리가 앞으로 사용할 방법이 2의 보수 표현법이다
같은 1111이더라도 부호와 크기 표기로는 -7 이고, 1의 보수 표기로는 -0이며, 2의 보수에선 -1 이다
또한 프로그래머들은 자신이 다뤄야 하는 수를 표현하기 위해 필요한 비트의 개수를 알 필요가 있다
실수 표현 방법
고정 소수점 표현법
4비트 기준 2비트는 정수, 2비트는 소수를 표현하는 방법
특별한 목적을 가진 컴퓨터는 이 방법을 사용
but. 범용 컴퓨터는 넓은 범위의 수를 다뤄야 하기 때문에 이 방법을 사용하면 메모리 비용이 너무 많이 듦
부동 소수점 표현법
과학적 표기법을 2진수에 적용 과학적 표기법에서는 0.0012를 1.2 x 10-³ 이라고 표기.
이를 2진수에서는 밑을 2로하는것만 다를 뿐 같은 방법 사용
부동소수점 표현법은 가수(1.2) 와 지수(10-³) 를 분리함으로써 0.0012 처럼 0을 모두 저장하지 않고도 큰 수나 작은 수를 표현할 수 있다
그러나 비효율적인 점도 있는데 비트 조합 중에 낭비되는 부분이 많고, 비트 패턴이 가능한 모든 수를 표현하지는 못한다 - 지수가 커질수록 가수의 한 패턴과 다른 패턴사이의 갭이 커진다
그래서 정밀도를 높이기 위해
1. 정규화 : 가수를 조정해서 맨 앞에 0이 없게 만드는 것
2. 가수의 맨 왼쪽비트는 무조건 1이기 때문에 이를 생락하여 비트를 확보하는것 등등..
부동 소수점의 음수표현
기본 정밀도와 2배 정밀도 모두 가수에 대한 부호를 1비트 사용한다
지수에 대한 부호는 편향된 지숫값을 사용하여 기본정밀도의 경우 편향값을 127로, 2배 정밀도 수는 1023을 지수 0으로 표현하고 각각 -126~127 을, -1022 ~ 1023을 나타낼 수 있게 하였고
00000000이나 11111111 같은 특별한 지숫값들을 특별한 비트 패턴(양의 무한대, 음의 무한대, NaN등..)으로 표현할 수 있게 하였다
2진 코드화한 10진수(BCD)
BCD는 4비트를 사용해 10진 숫자를 하나 표현하는 방식이다.
옛날 컴퓨터와 현재 일부 장치들에 사용되고 있지만 BCD는 2진수를 효율적으로 사용하지 못하기때문에 점차 다른방법을 사용하는식으로 변해갔다
8진 표현법
2진수 비트들을 3개씩 그룹으로 묶는법
숫자앞에 0을 붙여서 8진수임을 나타낸다 (숫자 15를 나타낼때 017 은 8진수 15는 10진수)
16진 표현법 (현재 주류)
요즘은 컴퓨터 내부가 8비트의 배수를 사용해 만들어지기 때문에 고안된 방법
숫자는 0~9까지 10~15까지는 abcdef를 사용하여 표기한다
접두사 0x 를 붙여서 16진수임을 나타낸다 (숫자 303을 나타낼때 0x12f 는 16진수, 303은 10진수)
비트 그룹의 이름
비트는 너무 작아서 기본 단위로 사용하기에는 유용성이 떨어지기 때문에 비트를 큰 덩어리로 조직화 함
8비트 덩어리는 바이트byte
32비트 덩어리는 워드word
더 큰 단위들은 키비(KiB), 메비(MiB) 등등..
아스키 코드(ASKII Code)
컴퓨터에서 수 외에도 문자를 표현하려는 시도를 했다
그중 하나가 정보 교환을 위한 미국 표준 코드(ASCII) 코드이며, 아스키는 알파벳을 포함한 키보드에 있는 모든 기호에 대해 7비트 수 값을 할당했다
아스키 코드중 몇가지는 글자를 출력하는데 쓰이지 않고 장치를 제어하기 위해 쓰이는 제어문자 이다
유니 코드(Unicode)
컴퓨터가 널리 쓰이게 됨에 따라 영어 외의 언어를 지원해야 할 필요가 생겼고, 비트 가격이 떨어짐에 따라 유니코드 라는 새로운 표준이 만들어졌다
유니코드는 16비트 코드를 사용하며 현재 21비트까지 확장되었다
유니코드는 문자 코드에 따라 각기 다른 인코딩을 사용한다
색 표현 부터 시작하면 됨