이진수에서의 반올림은 10진수 때와 같다. 예를들어 소수점 두자리수 까지 표현하는 수가 있다고 할 때, 1.11101이 있다면 표현 밖의 수가 반 이상이기 때문에 올림 해준다.
그리고 1.11001 이라면 반보다 작기 때문에 버려준다.
그렇다면 1.111 일때 처럼 딱 절반 일 때는 어떻게 할 것인가? 여기서는 두번째 자리수가 올림 했을때 짝수가 되기 때문에 올려준다. 즉 1.111 일때는 올려주어 1.12 = 10.00이 되고, 만약 1.101 이라면 버려주어 1.10이 된다.
먼저 각각의 타입을 표현하는 비트수를 알아야 한다. int는 32비트 float는 32비트 double은 64비트이다.
그리고 다음 알아야 할 것은 각 타입이 나타내는 수의 범위이다.
먼저 int형은 정수를 나타내고 float는 소수까지 나타낸다. float보다 더 큰 수의 소수 까지 나타낸다.
그래서 몇가지 자주 틀리는 예시만을 살펴보면
1) int(float a) 소수 부분이 짤리게 된다.
2) float(int a) int형은 float보다 훨씬 더 높은 수까지 표현 가능하기 때문에 값이 짤리게된다.
3) double(float a) 이상없이 변환이 이루어진다.
4) double(int a) 이상없이 변환이 이루어진다.
5) 2/3 == 2/3.0 틀리다 인트/인트 가 1보다 작으면 이것의 값은 0이 나온다. 그에 비해 2/3.0 즉 인트/double 의 경우에는 double형이 나오기 때문에 소수점도 표현이 가능하다.
6) d < 0.0 -> ((d*2) < 0.0) double은 부호를 할당하는 비트가 따로 존재하고, 양수를 곱하면 부호는 그대로 이다.
7) d*d >=0.0 음수음수, 양수양수 는 무조건 0거나 같다.
8) (d+f)-d == f d와f를 더해서 값이 터질 수 있다.
1) 명령어 해독기(instrunction decoder)
-명령어 레지스터(IR)로부터 들어온 명령어의 연산 코드를 해독하여 해당 연산을 수행하기 위한 루틴의 시작 주소를 결정
2) 제어 주소 레지스터(CAR) - PC 같은 느낌
-다음에 실행할 마이크로명령어의 주소를 저장하는 레지스터
3) 제어 기억장치(control memory) - 명령어 모음 라이브러리 느낌
-마이크로명령어들로 이루어진 마이크로프로그램을 저장하는 내부 기억장치
4) 제어 버퍼 레지스터(CBR) - IR 같은 느낌
-제어 기억장치로부터 읽혀진 마이크로명령어 비트들을 일시적으로 저장하는 레지스터
5) 서브루틴 레지스터(SBR) - 스택이 가리키는 메모리 느낌
-마이크로프로그램에서 서브루틴이 호출되는 경우에 현재의 CAR 내용을 일시적으로 저장하는 레지스터
6) 순서제어 모듈(sequencing module) - CAR 보조자 느낌?
-마이크로명령어의 실행 순서를 결정하는 회로들의 집합
1) 0~63번지 : 공통 루틴들 저장
2) 64~127번지 : 각 명령어의 실행 사이클 루틴들 저장
명령어의 연산 코드가 지정하는 연산을 위한 실행 사이클 루틴의 시작 주소를 결정하는 동작 이다.
사상(mapping)을 이용한 해독 방법
-명령어의 연산 코드를 특정 비트 패턴과 조합
ex) 16-비트 길이의 명령어가 4비트의 연산코드, 1비트의 간접 주소지정 (I) 비트 및 7비트의 주소롤 구성된 경우
명령어 코드 : [XXXX] [I] [10100110010]
사상 함수 : [1XXX00]
연산코드 = 0001 -> 실행 사이클 루틴의 시작주소 = 1000100 (68번지)
1) 연산 필드가 두 개이면, 두 개의 마이크로-연산들을 동시에 수행 가능
2) 조건(CD) 필드는 분기에 사용될 조건 플래그를 지정
3) 분기(BR) 필드는 분기의 종류와 다음에 실행할 마이크로명령어의 주소를 결정하는 방법을 명시
4) 주소 필드(ADF)의 내용은 분기가 발생하는 경우에 목적지 마이크로명령어의 주소로 사용
[연산 필드1] [연산 필드2] [조건 필드] [분기 필드] [주소 필드(ADF)]
3 / 3 / 2 / 2 / 8 = 18비트