일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- async
- 상호배제
- scrollview
- 운영체제
- deadlock
- 데드락
- Swift
- 인프런
- 앨런
- Algorithm
- 100 days of SwiftUI
- Codable
- IOS
- 프로세스 스케줄링
- core data
- @state
- UserDefaults
- 알고리즘
- 오브젝트
- struct
- forEach
- Apple Developer Academy
- decode
- Linked List
- COLOR
- 가상 메모리
- 비동기
- 동시성
- SwiftUI
- 동기화
- Today
- Total
기어가더라도 제대로
한 권으로 읽는 컴퓨터 구조와 프로그래밍 - 1 - 본문
컴퓨터 내부의 언어 체계
컴퓨터는 비트를 가지고 노는 기계다.
비트가 무엇인지 배우고 비트로 무엇을 할 수 있는지에 대해 배운다.
비트나 비트의 모음에 의미를 부여하기 위해 "있다고 치고" 놀이를 해보자.
+ 언어란 무엇인가
+ 문자 언어
+ 비트
+ 논리 연산
+ 불리언 대수
+ 드모르간 법칙
+ 정수를 비트로 표현하는 방법
+ 양의 정수 표현
+ 2진수 덧셈
+ 음수 표현
인코딩
어떤 정보를 정해진 규칙에 따라 변환하는 것(en-code-ing)을 일컫는다.
가, 나, 다, 하 를 숫자로 변환하면 일정한 규칙에 의해 1, 2, 3, 14 로 변환 할 수 있다.
- 모스 부호 등이 대표적 인코딩이다.
언어란 무엇인가?
모든 언어의 뜻은 기호의 집합으로 인코딩 된다.
- 나는 밥을 먹는다. == > '나'라는 사람이 '밥'이라는 물질을 '먹는 행위'를 한다. 단어로 약속된 기호를 쓴다.
- 우리가 사용하는 언어도 일종의 기호의 집합으로 인코딩 된 것이다.
- 똑같은 단어여도 문맥이 중요하다. 여자친구의 "괜찮아"는 문맥에 따라 적절히 해석해야 한다.
- 컴퓨터도 마찬가지로 문맥이 중요하다.
문자 언어
문자 언어는 기호를 나열한 것이다.
언어를 구성하는 3가지 요소가 있다.
- 기호나 조합 : 한글 24자모로 많은 단어를 조합한다.
- 표의 문자 : 일어, 한자
- 순서 : 'dog' 와 'god' 은 같지 않다.
"컴퓨터 언어"의 구성요소 3가지
- 기호가 들어갈 상자: ㅁㅁ 2비트의 자리수를 표현한다.
- 상자에 들어갈 기호: 0 과 1 이 각 비트를 차지할 수 있다.
- 상자의 순서: 10 과 01 은 다르다.
비트
언어는 이 상자를 문자(Charactor) 라고 부르고 컴퓨터는 상자를 비트(Bit)라고 부른다.
bit = binary + digit
2진수 숫자
- 비트를 사용하면 적은 비용으로 편리하게 기호를 담을 수 있다.
- 기호는 추상적이다.
- 점과 선
- 낮과 밤
- 쌀 보리
그래서 우리는 컴퓨터를 사용한 계산의 비트에 의미를 부여하는 약속, 문맥을 알면
- 논리
- 숫자 - 양수, 음수, 실수
- 언어 - ASCII, UTF-8
- 색 - RGB, RGB+A
등을 만들어 낼 수 있다!!
논리 연산
날씨가 좋은가? 내 모자를 좋아하나? 등에 예/ 아니오로 대답
- 예 == 참
- 아니오 == 거짓
"눈이 오고, 학교에 가는 날이 아니라면 스키를 타러 가라"
* 눈이 오는가 ? ⇒ 참
* 학교에 가는 날인가? ==> 거짓
* "스키를 타러 간다"
다른 비트들이 표현하는 내용으로부터 새로운 비트를 만들어내는 이런 동작을 논리 연산 이라고 한다.
불리언 대수
숫자에 대해서 + - * / 등의 연산자를 알고 있을 것이다. bit 에 대해서도 이런 기능을 하지는 않지만, 연산자가 있다.
이 연산자들을 만든 사람이 조지 불이라는 사람인데, 불의 대수라고 해서 불리언 대수라고 한다.
일반 대수 처럼
- 결합 법칙
- 교환 법칙
- 분배 법칙
등을 적용할 수 있다.
기본적인 불리언 연산자.
- NOT: 논리적 반대, 거짓인 비트에 NOT 하면 참이 된다.
- AND: 둘 이상의 비트에 작용하는 연산. 첫 비트가 참이고 두번째 비트가 참인 경우 결과가 참이된다.
- OR: 첫 비트가 참이거나 두 번째 비트가 참이면 결과가 참이 된다.
- XOR: 합성 연산인데, 첫 번째 비트와 두번쨰 비트가 다른 값인 경우 참이 된다
드모르간 법칙
이 법칙을 개인적으로 이중 부정 법칙이라고 치환한다.
** a AND b == NOT(NOT a OR NOT b) **
드모르간의 법칙이 왜 쓸모있느냐하면은 NOT 연산도 하나의 계산이니 비용이 드는데, 오른쪽에 낫낫낫을 다 없애주고 AND 하나만 남기면 얼마나 비용이 절약되겠는가?
정수를 비트로 표현하는 방법
양의 정수 표현
10진수 체계에서는 10가지 기호인 숫자를 상자에 담을 수 있다.
5028 은
5 X 10^3^ + 0 X 10^2^ + 2 X 10^1^ + 8 X 10^0^
( ) + ( ) + ( ) + ( )
으로 표현 가능하다.
괄호 하나 하나가 상자다. (있다 치고 놀이,, 그렇다 치고 ~)
이 체계는 지수를 적용할 밑으로 10을 사용하기 때문에 밑이 10인 시스템이라고 부른다.
여기서 토막 상식
밑^지수^ (예: 10^3^)
10진수에서도 더 큰 숫자를 표현하기위해 상자를 추가하듯 2진수에서도 상자를 추가해서 해결 가능하다.
2진수 체계는 2를 밑으로 하는 수 체계이다.
5028은 2진수로 이렇게 표현 가능하다.
0001 0011 1010 0100
5028을 10진수로는 4자리 숫자라고 말하고, 2진수로는 13비트 수가 된다.
13자리로 표현 가능한데 가장 앞에 0을 3개 더 붙였다. 이 추가된 0들을 리딩 제로(leading zero)라고 말한다.
이 덕분에 숫자를 표현하는데 필요한 최소 상자의 개수보다 더 많은 상자를 추가할 수 있다.
2진수에서
- 가장 오른쪽의 비트(LSB)
- 가장 작은 유효 비트(least significant bit)
- 가장 왼쪽의 비트(MSB)
- 가장 큰 유효 비트(most significant bit)
2진수의 덧셈
10진수를 덧셈할 때 가장 오른쪽 상자부터 더하고 올림이 있으면
1을 그 다음 자리 숫자를 더할 때 같이 더한다
2진수도 마찬가지다.
각 비트를 LSB 에서 MSB 쪽으로 더하며 결과가 1보다 크면 1을 다음 자리 (왼쪽)로 올린다.
근데 이걸 사람은 그냥 하지만 컴퓨터는 어떻게 한단 말인가? 바로 논리 연산 을 통해서 한다.
- 두 비트를 서로 더한 결과
- XOR
- 올림
- AND
비트 더하기 비트는 결과가 올림도 처리하기 때문에 3비트다.
- 오버플로
- 덧셈 결과가 우리가 사용할 비트의 개수로 표현할 수 있는 범위를 벗어나면 나타나는 현상
- MSB 에서 올림이 발생했다는 뜻
- 컴퓨터는 이를 조건코드 레지스터에 플래그를 세워서 정보를 담아둔다.
- 그 중 오버플로 비트가 있는데 여기에 MSB 에서 올림한 1을 담아 놓는다.
- 언더 플로
- MSB 위쪽에서 1을 빌려오는 경우
- 뺄셈을 할 때를 떠올려 보자. 10 - 9 를 하면 1의 자리에서 10을 빌려와서 9를 빼고 1을 남기는것
음수 표현
- 부호와 크기 방법
- 1의 보수
- 2의 보수
부호와 크기 방법
- 비트 하나를 써서 양부호화 음부호를 표현
- MSB 에 부호 비트를 넣기로 약속
- 4비트에 1개는 부호를 넣고 나머지 3 비트로 수를 표현한다.
- 단점
- 0을 표현하는 방법이 두가지다(1000,0000)
- XOR과 AND 를 이용한 덧셈을 못한다.
- 예시) 1과 -1을 계산
- 0 0 0 1 == 1
1 0 0 1 == -1
+ ------------
1 0 1 0 == -2
1의 보수
- 양수의 보든 비트를 뒤집는 방법
- 구성
- 부호비트 / 나머지 비트
- NOT 연산을 통해 수를 얻음
- 예
- 0111(+7) => 1000(-7)
- 단점
- 0 표현 방식 두가지
- 순환 올림
- MSB 에서 올림이 발생하면 LSB로 올림을 전달
- 이를 위해 별도 장치 필요
- 비용 증가 ㅠㅠ
- 다만 덧셈은 가능
- 0010 (2)
- 1110 (-1)
+ ----- - 0001 (1)
하지만 복잡하다
2의 보수
하드웨어를 추가할 수 없고, AND, XOR 연산만 사용해야 한다면?
+ 1을 했을 때 0이 나오는 패턴을 찾고 이 패턴을 - 1 이라고 부르자
- 예시
0001 == 1
- 각 자리의 비트를 뒤집는다(NOT) : 1110
- 여기에 1을 더한다 : 1111
- 원래수인 1과 1111을 더하면 : 0
0 중복 없음!
0000
각자리의 영을 뒤집어서 에 1을 더하면 1111 + 1 == (1)0000
올림처리 되는 1은 없는 숫자 취급한다.
즉 0 == 0 이다.
'책 리뷰' 카테고리의 다른 글
앞으로 읽을 책들 정리 (2) | 2022.07.03 |
---|---|
몰입의 즐거움 - 미하이 칙센트 (6) | 2022.06.18 |