이론 정리/컴퓨터 구조
한 권으로 읽는 컴퓨터 구조와 프로그래밍 1장 정리
철매존
2024. 2. 18. 23:53
728x90
- 언어
- 의사소통을 위해 쓰고, 문맥에 따른 의미
- 문자 언어
- 기호의 나열
- 비트
- 'binary' + 'digit' -> 요거 두개를 합친 말이라고 함
- 2진법 사용
- 논리 연산
- 논리적으로 예/아니오
- 불리언대수
- 비트에 대해 사용 가능한 연산 규칙 집합
- 결합법칙, 교환법칙, 분배법칙을 적용 가능
- NOT : 논리적 반대
- AND : 전부 참이어야 참
- OR : 하나라도 참이면 참
- XOR : 서로 달라야 참
- 드모르간의 법칙
- (A and B) == NOT(NOT A or NOT B)
- 정수를 비트로 표현
- 2진수 쓰자
- 그럼 음수는?
- 부호화 크기 표현법
- 한 비트를 부호에 사용, 나머지 비트를 0부터의 크기를 표현 -> 잘 안쓰임
- 비트 구성에의 비용에서 0을 표현하는 방법이 2가지라 비용 낭비
- 덧셈 계산 불가능
- 한 비트를 부호에 사용, 나머지 비트를 0부터의 크기를 표현 -> 잘 안쓰임
- 1의 보수
- 양수의 모든 비트를 뒤집기
- 7 -> 0111(2)
- 6 -> 0110(2)
- -6 -> 1001(2)
- -7 -> 1000(2)
- 부호와 크기 표현법과 비슷하게 비트를 부호 비트와 나머지로 나눔
- 문제는 동일
- 그리고 MSB(가장왼쪽비트)에서 올림이 있으면 LSB(가장오른쪽비트)로 올림 전달하는 순환 올림이 필요 -> 복잡하고 순환올림 처리 따로 필요
- 양수의 모든 비트를 뒤집기
- 2의 보수
- 요즘은 이걸 쓴다.
- 숫자를 뒤집어서 1 더하는걸 음수로 표현하기
- 참고로 이런 방식들은 문맥에 따라 어떤걸 썼냐를 알아두는게 좋을것이다.
- 부호화 크기 표현법
- 그럼 실수는
- 고정소수점 표현법
- 임의로 2진 소수점 위치를 정하는거
- 예를들어 4비트면 (왼쪽2비트는 정수) (오른쪽2비트는 소수점) 이런식으로
- 이거 좋기는 한데 범용컴퓨터(좀 일반적으로 다양한 역할로 쓰는거)에서는 넓은 범위의 수를 다뤄야 하는데 이럴려면 큰 숫자를 쓸거고 -> 그러면 지금 방식은 너무 필요 비트가 많아질것이다.
- 임의로 2진 소수점 위치를 정하는거
- 부동소수점 표현법
- 과학적 표기법을 2진수에 적용
- 가수 * (2의지수배) 로 하는거
- 그니까 10진수에서 13 * 10^2 이런것처럼
- 2진수에서는 (1 * 1/2) * 2^2 이런식으로
- 가수를 만들고 거기다가 지수를 곱하는거
- 2의 지수배를 곱하니까 큰 수를 표현하기 좋다.
- 소수점의 이동이 가능하다.
- 다만, 딱봐도 엄청 비효율적이다.
- 0.0 * 2^0 ~ 0.0 * 2^3 => 싹다 0
- 비트패턴이 가능한 모든 수를 표현하지 못함
- 이게 보면 지수가 커질수록 패턴사이 값차이가 커짐
- => 근데 이게 왜 모든 수를 표현하지 못하는걸까?
- 지수가 커지면 얘가 차이가 커져서 중간에 값을 표현하기 골때림 -> 2 4 8 16 32 64 ...
- 자바에서 그래서 double같은거 쓰면 이상한 결과가 나오는 떄가 많다.
- 가수 * (2의지수배) 로 하는거
- 그래서 보니까 블록체인같은거 구현할떄는 float 연산을 지원하지 않는다함
- 과학적 표기법을 2진수에 적용
- 고정소수점 표현법
- 2진코드화한 10진수 시스템(BCD : binary-coded decimal)
- 2진수로 수를 표현하는 방법중 하나
- 4비트를 사용해 10진 숫자를 표현한다.
- 12 -> 0001 0010 (2)
- 0001 -> 10의자리 1
- 0010 -> 1의자리 2
- 척봐도 뭔가 많이 써야함 -> 잘 안쓰임
- 2진수를 다루는 쉬운 방법
- 2진수로 되어있으면 보기 힘듦
- 8진 표현법
- 말 그대로 3비트씩 묶어서 보여주기
- 16진
- 4비트씩
- 이게 많이 쓰이는 이유는 요즘 컴퓨터 내부가 8비트의 배수를 사용해서 만들어져서임
- 비트 그룹 이름
- 니블 : 4bit
- 바이트 : 8bit
- 하프 워드 : 16bit
- 워드 : 32bit
- 더블 워드 : 64bit
- 텍스트 표현
- 아스키 코드
- 우리가 알고있는 그거임, 사실 표준이었음
- 유니코드
- 아스키는 기본적으로 영어 기반이라 다른 언어들을 지원하기 위해 도입
- 16비트로 시작해서 지금은 21비트까지 확장됐다.
- 유니코드 변환 형식 8비트
- 컴퓨터는 아직 8비트를 사용해 문자를 표현함
- 그래서 유니코드를 문자 코드에 따라 다른 인코딩을 사용해 해결함
- 인코딩이란 : 다른 비트 패턴을 표현하기 위해 사용하는 비트 패턴
- UTF-8
- 아스키코드는 그냥 8비트라 고대로 사용
- 문자를 8비트 덩어리(옥텟)의 시퀀스로 인코딩
- 0 -> 1바이트 / 110 -> 2바이트 / 1110 -> 3바이트 / 11110 -> 4바이트
- 10 -> 이거는 위에서 2, 3, 4바이트 등을 쓴다고 알려주면 그 다음부터 요렇게 나타남
- 문자를 사용한 수 표현
- QP인코딩(출력 가능하게 변경한 인코딩 == Quoted Printable Encoding)
- = 다음에 바이트의 각 니블을 표현하는 16진 숫자 2개를 추가해 8비트값을 표현
- 아스키 코드가 아닌것들은 =EA=80 이런식으로 =뒤에 있는 니블로 표현하도록 작성하는것.
- 딱보면 1바이트 표현을 위해 3바이트를 사용해서 매우 비효율적
- = 다음에 바이트의 각 니블을 표현하는 16진 숫자 2개를 추가해 8비트값을 표현
- Base64
- 3바이트 데이터를 4문자로 표현
- 3byte -> 24bit 이거를 6bit짜리 4개로 나눠서 표현
- 원본데이터가 1바이트남으면 마지막에 =, 2바이트 남으면 ==
- 3바이트 데이터를 4문자로 표현
- URL인코딩
- Percent-Encoding이라고도 함
- % 뒤에 16진 표현을 덧붙인다
- 예를들어 / 가 따로 의미없이 쓰이기를 원하면 %2F 이렇게
- QP인코딩(출력 가능하게 변경한 인코딩 == Quoted Printable Encoding)
- 아스키 코드
- 색 표현
- 24비트 RGB -> 근데 24비트는 잘 안쓰고 컴퓨터에서 32비트 쓰니까 32비트를 사용
- 투명도
- 위에서 RGB각각 1바이트니까 남는 1바이트를 투명도로 사용
- 소숫점단위가 아니라 255(8비트) 에서 분수로 표현 (0.5면 127해서 255의 절반정도)
- 그리고 이 투명도(위에서는 0.5)를 색깔에 곱해서 저장하는것
- 색 인코딩
- 16진 트리플렛 -> #ffffff 이런거