2022. 2. 2. 22:00ㆍSolution`/컴퓨터구조론
[3.1]
다음 수들에 대한 8-bit 길이의 부호화-크기, 1의 보수 및 2의 보수 표현을 각각 구하라
(1) 19
8-bit 부호화-크기 : 0 001 0011
1의 보수 : 0001 0011
2의 보수 : 0001 0011
(2) -19
8-bit 부호화 크기 : 1 001 0011
1의 보수 : 1110 1100
2의 보수 : 1110 1101
(3) 124
8-bit 부호화 크기 : 0 111 1100
1의 보수 : 0111 1100
2의 보수 : 0111 1100
(4) -124
8-bit 부호화 크기 : 1 111 1100
1의 보수 : 1000 0011
2의 보수 : 1000 0100
[3.2]
문제 3.1의 각 결과가 값을 16-bit 길이의 표현으로 확장하라
(1) 19
16-bit 부호화-크기 : 0 000 0000 0001 0011
1의 보수 : 0000 0000 0001 0011
2의 보수 : 0000 0000 0001 0011
(2) -19
16-bit 부호화-크기 : 1 000 0000 0001 0011
1의 보수 : 1111 1111 1110 1100
2의 보수 : 1111 1111 1110 1101
(3) 124
16-bit 부호화-크기 : 0 000 0000 0111 1100
1의 보수 : 0000 0000 0111 1100
2의 보수 : 0000 0000 0111 1100
(4) -124
16-bit 부호화-크기 : 1 000 0000 0111 1100
1의 보수 : 1111 1111 1000 0011
2의 보수 : 1111 1111 1000 0100
[3.3]
2진수 '11101101'에 대한 10진수를 [예제 3-5]의 방법 및 [예제 3-6]의 방법으로 각각 구하고, 두 결과 값이 일치하는지 비교하라
[예제 3-5] 방법
1110 1101
>> -128 + (64 + 32 + 8 + 4 + 1) = -128 + 109 = -19
[예제 3-6] 방법
11101101
>> 1의 보수 + 1 : 00010010 + 1 = 00010011 = 19
>> - 붙여주기 : -19
- 두 방법의 결과 값은 일치한다
[3.4]
그림 3-2의 논리 연산회로에 NAND, NOR 및 exclusive-NOR 연산 기능을 추가하여 다시 설계하고, 제어 신호들도 정의하라
연산 선택 신호 | 출력 | 연산 | ||
S3 | S2 | S1 | ||
0 | 0 | 0 | AND | |
0 | 0 | 1 | OR | |
0 | 1 | 0 | XOR | |
0 | 1 | 1 | NOT | |
1 | 0 | 0 | NAND | |
1 | 0 | 1 | NOR | |
1 | 1 | 0 | exclusive-NOR | |
1 | 1 | 1 | - | - |
[3.5]
A 레지스터에 '10101101', B 레지스터 '11000011'이 각각 저장되어 있는 상태에서 다음과 같은 논리 연산들을 수행한 결과를 구하라
(1) AND 연산
AND 연산 : 두 bit 모두 1이면 1로 설정
10101101
11000011
----------
10000001
(2) OR 연산
OR 연산 : 두 bit중 하나만 1이여도 1로 설정
10101101
11000011
----------
11101111
(3) XOR 연산
XOR 연산 : 두 bit가 서로 다르면 1로 설정
10101101
11000011
----------
01101110
[3.6]
아래의 좌측과 우측 연산들 간에 동일한 결과를 산출하는 연산들을 서로 연결하라
1. AND 연산 (1) 선택적-세트
2. OR 연산 (2) 선택적-보수
3. XOR 연산 (3) 마스크
선택적-세트 : 특정 bit들을 1로 설정
-> OR 연산을 통해서 수행
선택적-보수 : 특정 bit들을 reverse
-> XOR 연산을 통해서 수행
마스크 : 특정 bit들을 0으로 설정
-> AND 연산을 통해서 수행
2 - (1)
3 - (2)
1 - (3)
[3.7]
A 레지스터에 저장되어 있는 데이터 '11010010'의 우측 다섯 비트에 '01110'을 삽입하는 방법을 설명하라
(1) 마스크 연산을 통해서 삽입하고 싶은 위치의 bit들을 전부 0으로 만들어주기
A 레지스터 : 110 10010
B 레지스터 : 111 00000
---------------------- 마스크 연산 (AND 연산)
result : 110 00000
(2) 삽입하고 싶은 bit와 마스크 연산의 결과와 OR연산
result : 110 00000
삽입 bit : 000 01110
-----------------------OR 연산
result : 110 01110
[3.8]
8-bit 레지스터에 2의 보수 '11010010'이 저장되어 있을 때, 아래의 시프트 연산들이 수행된 결과를 구하라. 단, 각 연산은 원래의 레지스터 내용에 대하여 수행하라
(1) 논리적 우측-시프트
최하위 bit는 버려진다
최상위 bit는 0으로 설정
>> 0110 1001
(2) 논리적 좌측-시프트
최상위 bit는 버려진다
최하위 bit는 0으로 설정
>> 1010 0100
(3) 순환 우측-시프트
최하위 bit의 값은 최상위 bit로 옮겨진다
>> 0110 1001
(4) 순환 좌측-시프트
최상위 bit의 값은 최하위 bit로 옮겨진다
>> 1010 0101
(5) 산술적 우측-시프트
부호비트는 반드시 고정
크기 비트의 가장 왼쪽 bit는 부호 비트의 값으로 설정
크기 비트의 최하위 bit는 버려진다
>> 1 110 1001
(6) 산술적 좌측-시프트
부호비트는 반드시 고정
크기 비트의 가장 왼쪽 bit는 버려진다
크기 비트의 최하위 bit는 0으로 설정
>> 1 010 0100
[3.9]
8-bit 레지스터에 2의 보수'10110011'이 저장되어 있을 때, 아래의 시프트 연산들이 수행된 결과를 구하라. 단, 각 연산은 앞 연산의 결과값에 대하여 수행하라 (예 : (1)번 결과값에 대하여 (2)번 연산을 수행).
(1) 논리적 우측-시프트
최하위 bit는 버려진다
최상위 bit는 0으로 설정
>> 0110 1001
(2) 순환 좌측-시프트
최상위 bit의 값은 최하위 bit로 옮겨진다
>> 1011 0010
(3) 산술적 우측-시프트
부호비트는 반드시 고정
크기 비트의 가장 왼쪽 bit는 부호 비트의 값으로 설정
크기 비트의 최하위 bit는 버려진다
>> 1 101 1001
(4) 산술적 좌측-시프트
부호비트는 반드시 고정
크기 비트의 가장 왼쪽 bit는 버려진다
크기 비트의 최하위 bit는 0으로 설정
>> 1 011 0010
[3.10]
A 레지스터에 '10110011'이 저장되어 있고 C 플래그의 값은 '0'으로 세트되어 있다
(1) SHRC(C 플래그를 포함한 우측 시프트) 연산을 수행한 후의 A 레지스터 내용을 쓰라
C(0) 1011 0011
SHRC 수행 : 0101 1001
(2) (1)의 결과에 대해서 SHLC 연산을 2번 연속 수행한 후의 A 레지스터 내용을 쓰라
0101 1001
SHLC 1번 수행 : C(0) 1011 0010
SHLC 1번 수행 : C(1) 0110 0100
[3.11]
초기 상태에서 어떤 레지스터에 '10110011'이 저장되어 있고 C 플래그의 값은 '1'이라고 하자
(1) RLC 연산을 수행한 결과를 쓰라
C(1) 1011 0011
RLC 수행 : C(1) 0110 0111
(2) (1)의 결과에 대하여 RRC 연산을 2번 연속 수행한 결과를 쓰라
C(1) 0110 0111
RRC 1번 수행 : C(1) 1011 0011
RRC 1번 수행 : C(1) 1101 1001
[3.12]
2의 보수로 표현된 아래의 수들에 대한 덧셈을 수행하고, 오버플로우가 발생하였는지 검사하라
(1) 100100 + 111010
- C1, C2가 서로 다르기 때문에 오버플로우가 발생한다
(2) 11001100 + 10111010
- C1, C2가 서로 동일하기 때문에 오버플로우가 발생하지 않는다
[3.13]
2의 보수로 표현된 아래의 수들에 대한 뺄셈을 수행하고, 오버플로우가 발생하였는지 검사하라
(1) 101100 - 101101
- 101100 + (010011)
- C1, C2가 서로 동일하기 때문에 오버플로우가 발생하지 않는다
(2) 11000010 - 01101000
- 11000010 + (10011000)
- C1, C2가 서로 다르기 때문에 오버플로우가 발생한다
[3.14]
8-bit 레지스터 R1에 '01110010'이 저장되어 있다. 아래 연산들이 수행된 후에 상태 플래그들 C, S, Z 및 V의 값은 각각 어떤 값으로 세트되는가? 단, 각 연산은 원래의 R1 내용에 대하여 수행하라
(1) R1과 11000110을 더한다
- C 플래그 : 1
- S 플래그 : 0
- Z 플래그 : 0
- V 플래그 : 1
(2) R1과 00011110을 더한다
- C 플래그 : 0
- S 플래그 : 1
- Z 플래그 : 0
- V 플래그 : 1
(3) R1과 10001101을 AND 연산한다
- C 플래그 : 0
- S 플래그 : 0
- Z 플래그 : 1
- V 플래그 : 0
(4) R1과 R1을 XOR 연산한다
- C 플래그 : 0
- S 플래그 : 0
- Z 플래그 : 1
- V 플래그 : 0
[3.15]
부호 없는 2진수들 간의 곱셈 (1001 × 0111)이 수행되는 과정을 그림 3-13과 같이 작성하라
사이클 | C 플래그 | A 레지스터 | Q 레지스터 | M 레지스터 | 과정 설명 |
초기 | 0 | 0000 | 0111 | 1001 | |
t(1) | 0 | 0100 | 1011 | 1001 | bit 1 검사 >> 1이므로 덧셈(A + M -> A) + 시프트(C->A->Q) A + M = 0000 + 1001 = 1001 C->A->Q : 0 1001 0111 : 0 0100 1011 |
t(2) | 0 | 0110 | 1101 | 1001 | bit 1 검사 >> 1이므로 덧셈(A + M -> A) + 시프트(C->A->Q) A + M = 0100 + 1001 = 1101 C->A->Q : 0 1101 1011 : 0 0110 1101 |
t(3) | 0 | 0111 | 1110 | 1001 | bit 1 검사 >> 1이므로 덧셈(A + M -> A) + 시프트(C->A->Q) A + M = 0110 + 1001 = 1111 C->A->Q : 0 1111 1101 : 0 0111 1110 |
t(4) | 0 | 0011 | 1111 | 1001 | bit 0 검사 >> 0이므로 시프트(C->A->Q) C->A->Q : 0 0111 1110 : 0 0011 1111 |
result | 최종 결과 = 0011 1111 = 1 + 2 + 4 + 8 + 16 + 32 = 63 |
[3.16]
2의 보수로 표현된 5-bit 데이터 간의 곱셈 (10101 × 01101)이 Booth 알고리즘으로 수행되는 과정을 [예제 3-25]와 같이 작성하라
사이클 | N | M 레지스터 | A 레지스터 | Q 레지스터 | Q` | 과정 설명 |
초기 | 5 | 10101 | 00000 | 01101 | 0 | <Q 레지스터의 최하위 bit, Q`을 보고 판단> |
t(1) | 4 | 10101 | 00101 | 10110 | 1 | 10 >> 뺄셈(A - M -> A) + 시프트(A->Q->Q`) A - M = 00000 + 01011 = 01011 A->Q->Q` : 01011 01101 0 : 00101 10110 1 |
t(2) | 3 | 10101 | 11101 | 01011 | 0 | 01 >> 덧셈(A + M -> A) + 시프트(A->Q->Q`) A + M = 00101 + 10101 = 11010 A->Q->Q` : 11010 10110 1 : 11101 01011 0 |
t(3) | 2 | 10101 | 00100 | 00101 | 1 | 10 >> 뺄셈(A - M -> A) + 시프트(A->Q->Q`) A - M = 11101 + 01011 = 01000 A->Q->Q` : 01000 01011 0 : 00100 00101 1 |
t(4) | 1 | 10101 | 00010 | 00010 | 1 | 11 >> 시프트(A->Q->Q`) A->Q->Q` : 00100 00101 1 : 00010 00010 1 |
t(5) | 0 | 10101 | 11011 | 10001 | 01 >> 덧셈(A + M -> A) + 시프트(A->Q->Q`) A + M = 00010 + 10101 = 10111 A->Q->Q` : 10111 00010 1 : 11011 10001 0 |
|
result | 최종 결과 = 1101110001 = -512 + (256 + 64 + 32 + 16 + 1) = -512 + 369 = -143 |
[3.17]
그림 3-12의 부호없는 2진수 곱셈기를 Booth 곱셈기로 변경하여 다시 그려라
사이클 | N | M 레지스터 | A 레지스터 | Q 레지스터 | Q` | 과정 설명 |
초기 | 4 | 1101 | 0000 | 1011 | 0 | <Q 레지스터의 최하위 bit, Q`을 보고 판단> |
t(1) | 3 | 1101 | 0001 | 1101 | 1 | 10 >> 뺄셈(A - M -> A) + 시프트(A->Q->Q`) A - M = 0000 + 0011 = 0011 A->Q->Q` : 0011 1011 0 : 0001 1101 1 |
t(2) | 2 | 1101 | 0000 | 1110 | 1 | 11 >> 시프트(A->Q->Q`) A->Q->Q` : 0001 1101 1 : 0000 1110 1 |
t(3) | 1 | 1101 | 1110 | 1111 | 0 | 01 >> 덧셈(A + M -> A) + 시프트(A->Q->Q`) A + M = 0000 + 1101 = 1101 A->Q->Q` : 1101 1110 1 : 1110 1111 0 |
t(4) | 0 | 1101 | 0000 | 1111 | 1 | 10 >> 뺄셈(A - M -> A) + 시프트(A->Q->Q`) A - M = 1110 + 0011 = 0001 A->Q->Q` : 0001 1111 0 : 0000 1111 1 |
result | 최종결과 = 00001111 = 15 |
[3.18]
바이어스가 127인 지수를 사용하는 부동소수점 형식에서 지수 필드의 값이 다음과 같을 때, 실제 지수값을 10진수로 쓰라
(1) 11111110
1111 1110 - 0111 1111 = 1111 1110 + 1000 0001 = 0111 1111 = 127
>> 실제 지수값 = 127
(2) 01111111
0111 1111 + 1000 0001 = 0000 0000 = 0
>> 실제 지수값 = 0
(3) 10110101
1011 0101 + 1000 0001 = 0011 0110 = 54
>> 실제 지수값 = 54
(4) 00101101
0010 1101 + 1000 0001 = 1010 1110 = -128 + (32 + 8 + 4 + 2) = -128 + 46 = -82
>> 실제 지수값 = -82
[3.19]
부동소수점 표현에 관한 아래 물음에 답하라
(1) 바이어스 128을 사용하는 32-bit 부동소수점 형식으로 10진수 -1.625를 나타내라. 단, 지수 필드는 8bit이고, 가수 필드는 정규화된다
1.625 = 1.101 = 0.1101 × 2^(1)
부호(s) 필드 = 1
지수(E) 필드 = 1 + 128(바이어스) = 1000 0001
가수(M) 필드 = 101 0000 0000 0000 0000 0000
부호(S) 필드 | 지수(E) 필드 | 가수(M) 필드 |
1 | 1000 0001 | 101 0000 0000 0000 0000 0000 |
(2) 위의 (1)번을 지수 필드가 9bit이고 바이어스가 256인 64-bit 부동소수점 형식에 대하여 다시 풀어라
1.625 = 1.101 = 0.1101 × 2^(1)
부호(s) 필드 = 1
지수(E) 필드 = 1 + 256(바이어스) = 1 0000 0001
가수(M) 필드 = 101 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000
부호(S) 필드 | 지수(E) 필드 | 가수(M) 필드 |
1 | 1 0000 0001 | 101 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000 |
[3.20]
아래의 10진수들을 IEEE 754 표준 32-bit 부동소수점 형식으로 표현하라
- IEEE 754 표준 32-bit 부동소수점 바이어스 = 127 / 부호화-크기 표현 사용
(1) 5
5 = 101
>> 1.01 × 2^(2)
부호(S) 필드 : 0
지수(E) 필드 : 2 + 127 = 0000 0010 + 0111 1111 = 1000 0001
가수(M) 필드 : 01 0000 0000 0000 0000 0000 0000 0000 00
부호(S) 필드 | 지수(E) 필드 | 가수(M) 필드 |
0 | 1000 0001 | 01 0000 0000 0000 0000 0000 0000 0000 00 |
(2) 253.25
253.25 = 11111101.01
>> 1.111110101 × 2^(7)
부호(S) 필드 : 0
지수(E) 필드 : 7 + 127 = 0000 0111 + 0111 1111 = 1000 0110
가수(M) 필드 : 11111 0101 0000 0000 0000 0000 0000 000
부호(S) 필드 | 지수(E) 필드 | 가수(M) 필드 |
0 | 1000 0110 | 11111 0101 0000 0000 0000 0000 0000 000 |
(3) -1.625
1.625 = 1.101
>> 1.101 × 2^(0)
부호(S) 필드 : 1
지수(E) 필드 : 0 + 127 = 0111 1111
가수(M) 필드 : 101 0000 0000 0000 0000 0000 0000 0000 0
부호(S) 필드 | 지수(E) 필드 | 가수(M) 필드 |
1 | 0111 1111 | 101 0000 0000 0000 0000 0000 0000 0000 0 |
(4) -1/32
-1/32 = 0.00001
>> 1 × 2^(-5)
부호(S) 필드 : 1
지수(E) 필드 : -5 + 127 = 0111 1010
가수(M) 필드 : 0000 0000 0000 0000 0000 0000 0000 0000
부호(S) 필드 | 지수(E) 필드 | 가수(M) 필드 |
1 | 0111 1010 | 0000 0000 0000 0000 0000 0000 0000 0000 |
[3.21]
IEEE 754 표준 32-bit 부동소수점 형식으로 표현된 비트 패턴이 다음과 같을 때, 각각에 대한 10진수를 구하라
(1) 0 10000011 10100000000000000000000
부호(S) 비트 = 0 >> 양수
지수(E) 필드 : 1000 0011 = 131
>> 실제 지수값 = 131 - 127 = 4
가수(M) 필드 : 101
>> 실제 값 = 1.101 × 2^(4) = 11010 = 26
(2) 1 01111100 01101000000000000000000
부호(S) 비트 = 1 >> 양수
지수(E) 필드 : 0111 1100 = 124
>> 실제 지수값 = 124 - 127 = -3
가수(M) 필드 : 01101
>> 실제 값 = 1.01101 × 2^(-3) = 0.00101101 = -0.17578125
(3) 1 11010101 11010100000000000000000
부호(S) 비트 = 1
지수(E) 필드 : 1101 0101 = 213
>> 실제 지수값 = 213 - 127 = 86
가수(M) 필드 : 110101
>> 실제 값 = 1.110101 × 2^(86) = 2^(86)(1.828125) = -1.41444320895e+26
(4) 0 11111111 01100000000000000000000
부호(S) 비트 = 0
지수(E) 필드 : 1111 1111 = 255
>> 실제 지수값 = 255 - 127 = 128
가수(M) 필드 : 011
>> 실제 값 = 1.011 × 2^(128) = 2^(128)(1.375) ---- NaN
(5) 0 00000000 01100000000000000000000
부호(S) 비트 = 0
지수(E) 필드 : 0000 0000 = 0
>> 실제 지수값 = 0 - 127 = -127
가수(M) 필드 : 011
>> 실제 값 = 1.011 × 2^(-127) = 2^(-127)(0.375) = 4.40810381558e-39
[3.22]
그림 3-17의 부동소수점 표현으로는 '0'을 나타낼 수 없는 이유를 설명하라. 또한, IEEE 754 표준 32-bit 부동소수점 형식에서의 '0'에 대한 비트 패턴을 표시하라
가수(M)필드의 첫 번째 bit는 반드시 '1'이여야 하기 때문이다
IEEE 754 표준 32-bit 부동소수점 형식에서의 '0'에 대한 비트 패턴
>> 0 01111111 00000000000000000000000000000000
[3.23]
아래의 부동소수점 산술 연산들을 수행하라. 단, 연산을 수행한 후에는 반올림을 이용하여 결과값의 소수점 아래 6자리까지만 남기도록 하라.
(1) (0.111001 × 2-5) + (0.100111 × 2-3)
0.111001 × 2^(-5) >> 0.001110 × 2^(-3)
0.001110 + 0.100111 = 0.110101
>> result : 0.110101 × 2^(-3)
(2) (0.100011 × 26) - (0.111001 × 23)
0.111001 × 2^(3) >> 0.000111 × 2^(6)
0.100011 - 0.000111 = 0.100011 + 1.111000 = 0.011100
>> result : 0.011100 × 2^(6)
(3) (0.1001 × 28) × (0.1011 × 212)
가수 곱 : 1001 × 1011 = 0110 0011
지수 합 : 8 + 12 = 20
>> result : 0.01100011 × 2^(20)
[3.24]
컴퓨터에서는 데이터의 길이가 제한되어 있기 때문에 부동소수점 표현은 몇몇 수들만 정확하게 표현할 수 있을 뿐이고, 다른 수들은 근사치로 나타낸다. 만약 'A'을 실제 값 A의 근사치라고 한다면, 상대적 오차(relative error) r은 다음과 같이 표현된다
(1) A = 1.427일 때, A를 1.42로 절삭한 경우와 1.43으로 반올림한 경우의 상대적 오차를 각각 구하라
A를 1.42로 절삭한 경우 : r = (1.427-1.42)/1.427 = 0.490539%
A를 1.43로 반올림한 경우 : r = (1.427-1.43)/1.427 = -0.210231%
(2) 문제 3.23의 각 연산 결과에 대한 상대적 오차를 구하라
3.23 - (1) : 0.103516
3.23 - (1) 실제 계산 값 : 0.10400390625
>> r = (0.10400390625 - 0.103516)/0.10400390625 = 0.048791%
3.23 - (2) : 28
3.23 - (2) 실제 계산 값 : 27.875
>> r = (27.875 - 28)/27.875 = -0.448430%
3.23 - (3) : 405504
3.23 - (3) 실제 계산 값 : 405504
>> r = 0 (오차 X)