사실 코드라는 책 자체가 굉장히 점진적으로 설명하는 내용이라,,, 크게 별다른 내용은 없다.
1,2장의 내용을 요약하면 다음과 같다.
코드는 컴퓨터와 사람간의 의사소통을 위한 기호체계를 의미하며 이는 2가지 기호의 조합으로 표현가능하다.
이내용만 정리하기 좀 그러니,
한 권으로 읽는 컴퓨터 구조와 프로그래밍
을 좀 정리해보도록 하겠다.
1)
일단 2진수에서 가장 오른쪽 비트를 가장 작은 유효 비트, lsb라고 부르고,
가장 왼쪽 비트를 가장 큰 유효 비트 MSB라고 부른다.
1___00001011010_1
MSB LSB
비트수를 맞추기 위해 추가된 0들을 리딩제로라고 부름.
2) 2진수들의 덧셈
논리연산을 표현가능하다.
두비트를 서로 더한결과는 XOR한값이고, 올림은 두비트를 AND한 값과 같다.
예를들어, 10 + 11을 한다고 하자.
첫째자리에서, A xor b 하니 1이니까, 1
올림여부를 체크하려 A and B하니까 0이므로 올림 없다.
둘째자리에서 A xor b 하니 0이니까 0
올림여부를 체크하려 A and B하니까 1이므로 올림있다.
따라서 101.
만약 비트로 표현할수잇는범위를 넘어서면 오버플로,
MSB에서 올림이 발생했다는 뜻.
(*컴퓨터에는 condition code register가 있어서 이상한 정보를 담아두고, 오버플로 비트가 있다. 이값을 보면 오버플로가 발생했는지 알수있다.)
오버플로 발생시, 1001 + 1000 가 0001 이 된다.
MSB 왼쪽에서 1을 빌려오는 경우 언더플로라고 한다.
3) 음수 표현
음수표현은 여러가지 방식으로 할 수 잇음.
MSB를 부호로 표현하면, 0부터의 거리로 크기를 표현함.
그런데 이방법은 0을표현하는방식이 두가지라서 낭비되고, 이렇게 될시 XOR과 and만으로 덧셈계산을 할 수 없다.
그런데 1의 보수 표현법으로 음수를 표현할수있다.
양수의 모든 비트를 뒤집는것이다.
not 연산을 통해 보수를 얻는다.
001 이 1이면,
110 이 -1 이다.
0111이 7이므로
1000이 -7이다.
문제점이 2가지 존재
--> 여전히 0 2가지로 표현.
--> 덧셈쉽지않음. 순환 올림(end-around carry)
0010 + 1110
0001
--> 복잡.
--> 순환올림을 처리하기 위한 하드웨어를 추가해야함.
2의보수
특별한 하드웨어 추가없이, xor과 and연산만 사용해야한다면?
각비트에 not을 취하고 +1 하는방법.
0111 --> 7
1001 --> -1
이방법은 2가지 문제가 없을까?
우선 0의 두가지 표현.
0000 = 1111 +1
이어야하는데, 10000이므로, 1절삭되면 0000과 같다.
즉, 하나다.
실수를 표현하는 방법
고정소수점 vs 부동소수점.
고정소수점 = 1/2 + 1/4+ 1/8 이런식으로 표현하는방법
그러나 메모리가 너무 많이 든다. (너무 많은 비트 필요.)
부동소수점. floating point
일단 가수와 지수라는 개념.
가수: 소수좀 왼쪽이 하나뿐인 소수
지수 : 밑수를 거듭제곱한 값을 곱하는 방식
이렇게 소수를 표현가능함
1.2 * 10^-3
가수부분만 보면, 소수점의 위치가 같아보임.
풀어쓰면 항상 달라짐.
고정소수점에서는 소수점 바로 왼쪽이 항상 1의자리이지만,
부동소수점에서는 아니다.
따라서,
1.111 = (1+1/2) * (2**3)
이렇게 하면 0 표현하는게 4가지 방법임.
6.5를 표현하는 비트패턴이 없음. --> 오차 발생.
IEEE 부동소수점 표준.
포인트 정밀도 높이기
--> 정규화
가수를 조정해서 맨앞에 0이 없게 만듬.
--> 가수의 맨왼쪽 비트는 무조건 1이므로 생략할것.
single precision 부동소수점 = float
--> 32비트 사용 7비트 정밀도
double prescision부동소수점 = double
64비트 사용 15비트 정밀도로 표현
편향된 지숫값으로 + - 해결함.
기본정밀도 127 이
2배 정밀도 1023