2 (1의 시작비트)

Download Report

Transcript 2 (1의 시작비트)

컴퓨터시스템구조론
제9장
컴퓨터 산술 (Computer Arithmetic)
(숫자의 2진수 표현, 산술연산(덧셈,뺄셈,
곱셈, 나숫셈 등)
9.1 산술논리연산장치
(Arithmetic & Logic Unit : ALU)
중앙처리장치(CPU)의 핵심 부분
데이터에 대하여 실제적으로 산술 및 논리 연산을
수행하는 부분 (컴퓨터의 핵심부)
2진수를 저장하고 부울 논리 연산들을 처리하는
디지털 논리회로로 구성
정수(integer), 실수(real number),
부동소수점 수(floating point numbers) 처리
산술 보조프로세서(arithmetic
co-processor)의 지원을 받기도 함
ALU의 입력과 출력
 레지스터 : 2진수 데이터 입, 출력, 임시저장장치
 제어 유니트 : ALU의 동작 및 데이터 이동 제어
 플래그(Flag) : 연산결과 이상여부 표시
(오버플로우 등)
9.2 정수 표현(Integer Representation)
 2진수 체계에서는 “0” 과 “1“ , “(–) 부호” 및 “소수점”
을 이용하여 수를 표현
[예] -1101.01012 = -13.312510
 컴퓨터 내부는 (–)부호와 소수점 표시 불가(다른 방안)
 양수 및 음수의 표현 방법
 부호-크기 표현(signed-magnitude representation)
 2의 보수 표현(two’s complement representation)
n 1
 n비트의 2진 숫자 배열 : A   2i  ai
i 0
부호-크기 표현
 맨 좌측 비트를 부호(sign) 비트로 사용
• 0 : 양수
• 1 : 음수
[예] +18 = 00010010
-18 = 10010010
 문제점
 산술 연산 과정에서 부호와 크기 부분을 별도로 처리해야
한다
 0에 대한 표현이 두 개(+ 0과 – 0)이다
 0 검사(zero test) 불편, 수의 표현 범위 감소
 거의 사용 안 함
2의 보수 표현(Twos complement)
 음수 표현 방법 : 양수 표현에서 각 비트를 반전시키고
(0 → 1, 1 → 0), 1을 더한다. 최상위 비트가 부호를
표현하는 것은 동일
[예] +3 = 00000011
+2 = 00000010
+1 = 00000001
+0 = 00000000
-1 = 11111111
-2 = 11111110
-3 = 11111101
장점
 0에 대한 표현이 한 가지이다
 산술 연산이 용이하다
 음수화가 편리하다
2의 보수 정수의 기하학적 표현
2의 보수 표현의 공식화
2진수 A가 다음과 같다면, 이를 십진수로
바꾸면… 음수표현도 가능…
 2진수 :
A  an1 an2 an3 a3 a2 a1 a0
 10진수 :
A  2
n 1
n2
 an 1   2  ai
i
i 0
값박스(value box)의 이용

비트 길이가 다른 경우의 변환 (비트 확장)
 부호-크기 표현
: 단순히 부호비트를 맨 좌측으로 이동
 부호비트가 0인 양수의 경우 : 부호 비트를 0으로, 나머지는 0
[예] +18 =
00010010
+18 = 00000000 00010010
(8 비트)
(16 비트)
 부호비트가 1인 음수의 경우 : 부호 비트를 1으로, 나머지는 0
[예] -18 =
10010010
-18 = 10000000 00010010
(8비트)
(16 비트)
비트 길이가 다른 경우의 변환 (비트 확장)
 2의 보수 표현 : 부호 확장(Sign Extension)
 부호 비트(양수는 0, 음수는 1)를 맨 좌측으로 이동
 나머지 확장비트 : 양수는 0, 음수는 1로 채움

[예] +18 =
00010010
+18 = 00000000 00010010
(8 비트) 양수인 경우
(16 비트)
[예] -18 =
11101110
-18 = 11111111 11101110
(8 비트) 음수인 경우
(16 비트)
9.3 정수 산술
음수화(negation)
 부호-크기 표현에서의 규칙 : 부호비트만 반전시킴
 2의 보수 표현에서의 규칙
1. 각 비트를 반전시킨다
2. 결과값에 1을 더한다
[예]
+18 = 00010010
비트 단위의 반전(보수) = 11101101
+1
11101110
= -18
특수한 경우 (교재 p.244 참조)
 0의 보수 = 0
 -128의 보수 = -128 ????
 음수 계산시 최상위 올림수는 무시
덧셈
올림수는 무시
올림수는 무시
1비트로 표현할 수 있는
범위를 초과
1비트로 표현할 수 있는
범위를 초과
(양수+양수 = 음수??)
(음수+음수 = 양수??)
오버플로우 (Overflow)
 덧셈 혹은 뺄셈 결과값이 한 단어로 표현할 수 있는
수의 범위를 초과한 경우.
 ALU는 오버플로우 발생시 그 결과를 사용하지
못하도록 알림(Flag 사용)
 검출 규칙 : 모두 양수이거나 모두 음수인 두 수를
더한 결과값의 부호가 반대가 되면
오버플로우(Overflow) 임
뺄셈 : a – b = a + (-b) : b의 보수를 취한
후 더하면 됨
덧셈과 뺄셈을 위한 하드웨어 블럭 다이어그램
: A + B or A – B => A+(-B)
곱셈(Multiplication) :
MQ에서 M는 피승수(Multiplicand)
Q는 승 수(Multiplier)

곱셈은 덧셈과 뺄셈보다 더 복잡

부호 없는 정수의 곱셈 과정
① 승수(multiplier)의 각 숫자(digit)에 대하여 부분 곱
(partial product)을 계산 : 승수의 비트가 0이면 부분
적도 0, 1이면 부분곱은 피승수(multiplicand)와 동일
② 최종 결과값은 부분곱을 한 자리 수씩 왼쪽으로
이동(쉬프트)한 후, 더한다.
 효율적인 방법 : 부분곱이 발생할 때만 합을 구함, 승수
비트가 1이면 “덧셈+쉬프트”, 0이면 “쉬프트”만 필요
 두 n비트 2진 정수를 곱한 결과값의 길이는 2n 비트가
된다.
곱셈의 예 (11 x 13 = 143) : 부호없는 정수

1011

x 1101

1011

0000

1011
 1011
 10001111
피승수(Multiplicand) (10진수 :11)
승수(Multiplier)
(10진수 :13)
Partial products
Partial products
Partial products
Partial products
Product
(10진수 : 143)
곱셈기(multiplier)의 내부 블록도 (M
x Q = ?)
부호 없는 2진수 곱셈 과정의 흐름도
실행 과정의 예 (M*Q의 결과값은 A와 Q에 저장)
A+M
A+M
A+M
 M x Q 를 구하고자 함
 A레지스터는 결과 저장용, C는 올림수(Carry)저장
 Q의 마지막 비트가 1이면 A = A+M
& C, A, Q를 오른쪽으로 이어서 쉬프트함
 Q의 마지막 비트가 0이면 더하는 것 없이
C, A, Q를 오른쪽으로 이어서 쉬프트만 함
2의 보수의 곱셈
앞의 계산은 부호를 따져보면 –5*-3=-113이 됨
문제 발생 : 교재 p.250-251 참조
방법 1
• 음수를 양수로 변환
• 앞의 방법으로 곱셈 수행
• 승수와 피승수의 부호가 다르면, 결과값을 음수화
방법 2
• Booth 알고리즘(Booth’s algorithm) 이용
• 양수와 음수의 어떤 조합에서도 사용 가능
• 널리 사용
쉬프트 의미
 2진수에 2n을 곱하는 연산은 좌측으로 n비트
쉬프트 하는 것과 동일
00001011 *
00001011 *
00001011 *
00001011 *
21
22
23
24
=
=
=
=
00010110
00101100
01011000
10110000
Booth 알고리즘의 흐름도 (M
x Q = ?)
Booth 알고리즘의 예 (M x Q 계산시, 결과는
A와 Q에 저장됨) : 7 X 3 = 21
A-M
Booth 알고리즘의 예 (계속)
 Q0비트와 Q-1비트를 비교함
 처음에는 A와 Q-1비트는 0으로 세팅됨
 Q0=0, Q-1=1이면 A=A+M, 그리고 A, Q, Q-1을
이어서 우측으로 쉬프트, 단 A의 가장 왼쪽
비트는 그대로 유지함
 Q0=1, Q-1=0이면 A=A-M, 그리고 A, Q, Q-1을
이어서 우측으로 쉬프트, 단 A의 가장 왼쪽
비트는 그대로 유지함
 Q0, Q-1이 모두 0이거나 1이면 A, Q, Q-1을 계산
없이 우측으로 쉬프트만 한다, 단 A의 가장 왼쪽
비트는 그대로 유지함
Booth 알고리즘을 사용한 예제
-M ->
A-M
(1의 블록을 이용한 계산의 단축)
계산 방법(승수 Q가 양수일 때)
승수가 양수일 때 : 수열의 합을 이용
00111110 = 25 + 24 + 23 + 22 + 21
= 2(25 – 1) = 26 - 21
(2 – 1)
00011100 = 24 + 23 + 22
= 22(23 – 1) = 25 - 22
(2 – 1)
 따라서 1의 블록에서는 전체 1의 개수와 시작
1을 보면 2(1의 개수+1의 시작비트) – 2(1의 시작비트)
식이 성립
(1의 블록을 이용한 계산의 단축)
계산 방법(승수 Q가 양수일 때 (계속))
 M * Q에서 비트를 2배 확장한다.
 승수 Q의 1의 블록을 오른쪽부터 본다.
 Q를 2(1의 개수+1의 시작비트) – 2(1의 시작비트) 식으로
변환한다.
 M에 2n을 곱하는 것은 M을 n비트 좌측
쉬프트한 것과 같다.
 따라서 -M을 좌측 쉬프트하고, M을 좌측
쉬프트하면 됨
 예) 0011 * 0110 = 0011*23 + (-0011)*21
이므로 00000011을 3번 좌측 쉬프트,
-00000011을 1번 좌측 쉬프트 한 후 더함
(1의 블록을 이용한 계산의 단축)
계산 방법(승수 Q가 음수일 때)
승수가 음수일 때 : 수열의 합을 이용
11111000 = -27 + 26+ 25 + 24 + 23
= -27 + 23(24 – 1) = - 23
(2 – 1)
11110000 = -27 + 26+ 25 + 24
= -27 + 24(23 – 1) = - 24
(2 – 1)
 따라서 음수가 있는 1의 블록에서는 오른쪽 시작
1을 보면 됨. 즉, – 2(1의 시작비트) 식이 성립
(1의 블록을 이용한 계산의 단축)
계산 방법 (승수 Q가 음수일 때 (계속))
M * Q에서 비트를 2배 확장한다.
승수 Q의 1의 블록을 오른쪽부터 본다.
Q를 – 2(1의 시작비트) 식으로 변환한다.
M에 -2n을 곱하는 것은 -M을 n비트 좌측
쉬프트한 것과 같다.
 따라서 -M을 좌측 쉬프트하면 됨
 예) 0011 * 1110 = (-0011)*21 이므로,
-00000011(11111101)을
1번 좌측 쉬프트 하면 됨




나눗셈(Division)
 부호 없는 정수의 나눗셈(그림 9-15)
00001101
1011 10010011
1011
001110
Partial
1011
Remainders
001111
1011
100
Divisor(M)
Quotient(몫)
Dividend(Q)
Remainder(나머지)
Q의 비트를 왼쪽부터 검사하여 M보다 큰 값이 나올 때까지 몫을 0으로 채움
큰 값이 나오면 그 비트의 상위비트를 빼서 부분 나머지수를 구함
부분 나머지수에서 다음 하위비트를 추가하여 다시 반복
부호 없는 2진 나눗셈 과정의 흐름도
나눗셈 과정(1)
교재 그림 9.16 ~ 9.17 참조
 Q(피제수)/M(제수) 계산
=> 계산결과 Q는 몫, A는 나머지
A와 Q에 피제수 Q를 2의보수로 2배 확장하여 대입
(예 : Q=0111인 경우 A=0000, Q=0111
Q=1001인 경우 A=1111, Q=0111 )
나눗셈 과정(2)
 A, Q를 이어서 좌측으로 쉬프트
 A와 M의 부호가 같으면 A – M 을 계산
 A와 M의 부호가 다르면 A + M 을 계산
 계산 결과가 이전 A의 부호와 다르고, A 또는 Q가 0이
아니면 A를 이전상태로 복구
 계산결과가 이전 A의 부호와 같거나, A=0 이고 Q=0
이면 Q의 오른쪽 비트 Q0=1로 세트, A는 계산값으로
변경
 Q의 비트 수만큼 계산을 반복
=> 계산결과 Q는 몫, A는 나머지
, 단 Q와 M의 부호 다르면 몫은 Q의 반대부호(2의보수)
9.4 부동소수점 표현
(Floating-Point Representation)
 고정-소수점(fixed-point) 표현 : 소수점 이하의 수를
포함하는 실수(real number)의 표현 가능.
[예] 1001.1010 = 24 + 20 +2-1 + 2-3 = 9.625
 표현 범위 한계 : 매우 큰 수 및 매우 작은 수 표현 불가능
 부동-소수점(floating-point) 표현 : 과학적 표기(scientific
notation)의 지수(exponent)를 사용하여 소수점 위치 이동
가능  표현 범위 확대
[예] 10진수에 대한 부동-소수점 표현
976,000,000,000,000 = 9.76 x 1014
0.0000000000000976 = 9.76 x 10-14
2진수의 소수표현





0.1 = 1*2-1 = 0.5 = 1 – 2-1
0.01 = 1*2-2 = 0.25
0.11 = 1*2-1 + 1*2-2 = 0.75 = 1 – 2-2
0.001 = 1*2-3 = 0.125
0.111 = 1*2-1 + 1*2-2 + 1*2-3 = 1 – 2-3
2진수의 부동소수점 표현
± S x B± E => ± S x 2± E
단, 부호(sign) : + 혹은 –
S : 가수(significand) 혹은 멘티사(mantissa)
B : 기수(base) : 여기서는 2임
E : 지수(exponent)
2진 부동소수점 표현의 형식(32비트)과 예
지수값을 조정하여 첫째
비트는 무조건 1로 변환
+127
(bias = 127 = 01111111) : 실제 값에 127을 더함, 10100 => 8비트로
확장하면 실제값은 00010100 인데, 여기에 127(01111111)을 더하면,
00010100 + 01111111 = 10010011임(저장되는 값)
: 이유는 -127~128의 지수값을 표현하면 이를 0~255사이로 저장하기
위해서..
부동소수점 표현 방법과 예
 가수(멘티사) : 정규화(normalized) 표현 사용
 가수 필드의 첫번째 비트가 1이 되도록 지수 조정
총 24비트에서 첫 번째 0자리에는 1이 항상 있도록 지수를
조절하여야 한다.
 ± 1.bbbbb….bbb x 2±E
[예]
110 x 23
= 0.0110 x 27
= 1.1 x 25 (정규화 표현은 이러한 표현만 가능)
 결과적으로 가수 필드의 첫번째 비트가 항상 1이 되므로,
저장하지 않는다 (hidden bit).
 위 [예]의 수에 대한 부동소수점 표현 (bias=127) :
0 10000100 10000000000000000000000
부동소수점 표현 방법과 예(계속)
 1.10 x 25 의 부동소수점 표현방법
 부호 : 양수이므로 0
 지수 : 5 = 00000101이므로 여기에 127(01111111)
을 더하면 됨 ,
즉 00000101 + 01111111 = 10000100
 가수 : 110이므로 맨 처음 0의자리에 있는 1은 저장할
필요가 없으므로 10만 저장하면 됨
 결과 부동소수점 표현 (bias=127) :
(1비트 + 8비트 + 23비트 = 32비트)
0 10000100 10000000000000000000000
부동소수점 수의 표현 범위(range)
 32-비트 수 의 경우
지수는 8비트이므로 -127~128 까지 가능(127더하면 0~255)
가수는 23비트이므로 23개의 0부터 23개의 1까지 가능
 (처음에만 1, 나머지 23개는 모두 1인경우)
2 – 2-23 , 즉 가수가 1.11111111111111111111111 인 경우
 (처음에만 1, 나머지 23개는 모두 0인경우)
1, 즉 가수가 1.00000000000000000000000 인 경우
 - (2 – 2-23) x 2128 ~ - 2-127 사이의 음수들
2-127 ~ (2 – 2-23) x 2128 사이의 양수들
정확도(accuracy)
 가수의 비트 수에 따른 오차(error) = LSB의 가중치(weight)
[예] 23-비트 가수의 경우 : 2-23  1.2 x 10-7
표현 가능한 수의 범위 비교
(오버플로우, 언더플로우 비교 : 교재 p.260)
IEEE 754 표준
부동소수점 수의 표현을 위하여 제정된 국제표준
± 1.bbbbb….bbb x 2±E
주요 사항들
• 32-비트 / 64-비트 형식
• 지수(exponent) : 8-비트 / 11-비트,
바이어스 = 127 / 1023
• 가수(mantissa) : 23 비트 / 52 비트,
hidden bit (= 1)
• 표현 영역 : 10-38, 1038 / 10-308, 10308
2128  3.4 x 1038 이므로 1038까지라고 하는 것임
IEEE 754 형식들
 IEEE에 관한 추가적 참고 사항들 : 표 9.3, 표 9.4
9.5 부동소수점 산술
(Floating-Point Arithmetic)
 +, -, x, /
계산 과정 (X = XS ⅹBXe, Y = YS ⅹBYe)
 어느 한쪽의 가수를 이동시켜 지수를 통일화한다. 즉 BYe
으로 통일화한다
덧셈 : X + Y = (XS ⅹBXe-Ye + YS) ⅹBYe
뺄셈 : X - Y = (XS ⅹBXe-Ye - YS) ⅹBYe
단, Xe ≤ Ye
곱셈 : X ⅹY = (XS ⅹYS) ⅹ BXe+Ye
나눗셈 : X/Y = (XS / YS) ⅹ BXe-Ye
10진수에 대한 계산 예 : 덧셈과 뺄셈시에는
지수를 한쪽으로(예 : 103)으로 통일화한다.
X = 0.3 x 102 = 30  0.03 x 103
Y = 0.2 x 103 = 200
 X + Y = (0.3 x 102-3 + 0.2) x 103 = 230
 X – Y = (0.3 x 102-3 - 0.2) x 103 = (-0.17) x 103
= -170
 X x Y = (0.3 x 0.2) x 102+3 = 0.06 x 105 = 6000
 X / Y = (0.3 / 0.2) x 102-3 = 1.5 x 10-1 = 0.15
덧셈과 뺄셈
① 0인지 검사
② 가수의 자리 수가 일치하도록 위치 조정(alignment)
: 오차를 줄이기 위하여 작은 수를 시프트 시킨다.
③ 가수들의 더하기 혹은 빼기
④ 결과값의 정규화(normalization) : 1.bbb..로 고침
[예] 부동소수점 덧셈
② 지수 조정
0.110100 × 23
===> 0.001101 × 25
+ 0.111100 × 25
+ 0.111100 × 25
----------------------------------------↗
1.001001 × 25 =>
③ 더하기
④ 정규화
1.001001 × 25
(최종 결과)
곱셈과 나눗셈 (덧셈, 뺄셈 보다 간단함)
 2진수 부동소수점 곱셈 과정
① 가수들을 곱한다.
② 지수들을 더한다.
③ 결과값을 정규화한다.
[예]
(0.1011 × 23) × (0.1001 × 25)
① 가수 곱하기: 1011 × 1001 = 01100011
(부호없는 정수의 곱 : 음수가 아님)
② 지수 더하기: 3 + 5 = 8
③ 정규화: 0.01100011 × 28 = 1.100011 × 26
(결과값)
부동소수점
곱셈 과정
 2진수 부동소수점 나눗셈 과정
① 가수들을 나눈다.
② 피젯수의 지수에서 젯수의 지수를 뺀다.
③ 결과값을 정규화한다.
부동소수점
나눗셈 과정
 연산 결과로 발생할 수 있는 문제점들
• 지수 오버플로우(Exponent overflow) : 양의 지수값이
최대값 초과  +∞ 혹은 - ∞로 세트
• 지수 언더플로우(Exponent underflow) : 음의 지수값이
최대값 초과  0으로 세트
• 가수 언더플로우(Significand underflow) : alignment
과정에서 가수 비트를 잃는 경우  반올림(rounding)
• 가수 오버플로우(Significand overflow) : 두 가수의 덧셈
결과로 MSB에서 올림수 발생  재조정(realign-ment)
정확도 문제
 보호 비트(guard bits) : 부동소수점 연산과정에서의 오차(error)를
줄이기 위하여 최하위 가수 비트의 우측에 추가되는 비트들.
 실제 부동소수점 연산을 수행하는 ALU의 내부 레지스터들은 이들을
저장하기 위한 비트만큼 더 길다.
[예] x – y 계산 (x = 1.000….00 x 21 , y = 1.111….11 x 20)
(a) 보호 비트가 없는 경우
x = 1.000….00 x 21
- y = 0.111….11 x 21
---------------------z = 0.000….01 x 21
= 1.000….00 x 2-22
(b) 보호 비트가 있는 경우
x = 1.000….00 0000 x 21
- y = 0.111….11 1000 x 21
---------------------z = 0.000….00 1000 x 21
= 1.000….00 0000 x 2-23