Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

2의 보수 2's complement

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_17.html 답:

1111111
00000110=6<10>
11111010=-6<10>
00000000 0<10>
이러한 음수 표현 방법을 2의 보수 표현법(two's complement)이라고 한다. 비트 패턴으로 음수를 표현하는 여러 방법중에 하나이다. 하지만 요즘에 거의 이 방법으로 음수를 표현한다. 정수는 한정된 갯수의 비트로 표현된다. 이런 제한된 비트내에서 양수와 음수가 표현될 수 있다. 양수를 표현하는 패턴에 2진수 덧셈 알고리듬을 사용하여 더해서 결과가 0이 되는 패턴으로 음수를 표현한다. 가장 왼쪽의 캐리아웃 값은 버려진다.

이것은 2진수 덧셈 알고리듬을 사용해서 더해서 0을 만드는 패턴을 알아내는 방법이다.

2의 보수표현법으로 음수를 만드는 방법.

정수를 표현하는 N개의 비트가 있다. N개의 비트가 나타내는 수를 음수로 표현하기 위해서

  1. 각각의 비트를 0은 1로 1은 0으로 바꾼다.
2. 1을 더한다.

예:

양수: 0000 0001 ( 1 ) 변환된 비트:1111 1110 1을 더한것: 1111 1111 ( -1)

질문: 괄호를 채워보자.

양수: 0000 0110 ( 6<10> )

변환된 비트: __ __

1을 더한것: __ __ ( -6<10> )

음수 6

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_18.html

답:

양수: 0000 0110 ( 6<10> )

변환된 비트: 1111 1001

1을 더한것: 1111 1010 ( -6<10> )

결과적으로 -6이 됩니다.

다시 한번 자세히 보자. 어떤 비트패턴에 그 비트 패턴을 반대로 뒤집은 패턴을 더하면 더한 결과 패턴은 전부다1이다. 모든 패턴들이 다그렇다.

01101010 패턴
10010101 뒤집은 패턴
||1111||1111|| ||1로된 결과 패턴||

1로 된 결과 패턴에 1을 더하면 전부다 0인 패턴이 된다.

11111111 캐리 행
11111111 전부 1로된 패턴
00000001 더하는 1값
00000000
부정 또는 니게이션(negation) 알고리듬은 위와같은 방법을 사용한다. 3개의 패턴을 더하면 결과 값은 0이다. 만일 1패턴이 정수를 표현한다면,나머지 2 패턴을 더한값이 음의 정수의 값이다.

패턴 + 뒤집은 패턴 + 1 = 0

패턴 + (뒤집은 패턴+1) = 0

패턴 + (2의 보수패턴) = 0

조금 혼동되더라도 천천히 보자. 연습을 몇번해보면 익숙해진다.

0100 0111의 2의 보수가 무었입니까?

2의 보수로 정수를 표현하기

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_19.html

답: 0100 0111 1011 1000 뒤집은 값 1011 1001 1을 더한값

결과를 검산하여보자:

캐리값11111111
01000111
+10111001
=
00000000
0의 2의 보수값은 무었입니까?

0=00000000
뒤집은 값=11111111
1을 더한값=00000000

2의 보수를 구하는 알고리듬으로 0의 2의 보수를 구하면 결과값은 0이다. 0이 하나라는것은 좋은것이다. 대개 음수 0은 양수 0과 같도록 간주된다. 사인 매그너튜드 표현법에서 음수0과 양수 0으로 정수를 표현했던 것을 기억해 보자.

8비트로 2의 보수를 표현할때 어떤 정수를 표현할 수 있겠습니까? 2의 보수 표현법으로 양의 정수와 음의 정수를 다 표현할 수 있다. 답을 0으로부터 시작할 수 잇다. 0의 2의 보수를 표현할 수 있는 지 확인해보자. 순서대로 양수1과 음수1 그리고 2와 음수2 .... 이런식으로 해서 127까지 확인한다고 하자.

127=01111111 확인하기:01111111
뒤집은 값=10000000 10000001
1을 더한값=10000001 =
00000000
-127=10000001
이제 128을 해보자.

질문:

128 = 1000 0000 뒤집은 값 = __ __ 1을 더한값 = __ __

2의 보수로 표현할 수 있는 범위

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_20.html

답:

128 = 1000 0000

뒤집은 값 = 0111 1111

1을 더한값 = 1000 0000 ??????

2의 보수로 표현할 수 있는 범위
-(2^(n-1)) ... 0 ... 2^(n-1) - 1
예 n= 8
-(2^(8-1)) = -128 ... 0 ... 2^(8-1) - 1 = 127
128과 -128이 둘다 1000 0000이 되어버린다.옳은 표현이 아니다. 양수와 음수가 동시에 같은 패턴으로 표현될 수 는 없다. 그러므로 +128은 8 비트 2의 보수표현법으로 표현될 수 없다. 2의 보수표현으로 8비트로 표현될 수 있는 최대 양수는 127이다. 음수는 -1부터 -127을 표현할 수 있다.

1000 0000은 무슨 수를 표현하는가 알아보자. 1000 0000에 127을 더해보자.

1000 0000=?
0111 1111=127
=
1111 1111=-1
결과는 -1이다. 그러므로 10000 0000은 -128을 표현한다고 할 수 있다. 2의 보수 표현방법으로 8비트를 사용해서 -128,....,0,....+127을 표현할 수 있다.

질문: -128,...,0,...+127에는 몇개의 정수가 있습니까? 8비트로 몇개의 비트 패턴을 만들 수 있습니까?

음수와 양수를 표현하는 비트 (sign bit)

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_21.html

답:

256개의 정수 256개의 패턴

256 패턴 하나하나가 정수에 해당한다.

음의 정수를 표현하는 알고리듬은 양수와 음수에 둘다 적용할 수 있다. N이라는 숫자를 보수로 전환하자 바꿔말해 음수로 바꿔보자. N은 -N이 된다. 이제 -N을 보수로 전환해 보자. 보수로 전환한 수는 다시 N이 된다.

0110 1101 → 뒤집은 수 1001 0010 → 1을 더한 수 1001 0011

1001 0011 → 뒤집은 수 0110 1100 → 1을 더한 수 0110 1101

N개의 비트를 2의 보수로 표현할 때, 가장 왼쪽에 있는 비트(high order bit)가 0일 경우 양수를 의미하고 1일 경우 음수를 의미한다. 다행스러운 일이다. 하이오더 비트를 사인 비트(sign bit)라고도 불린다. 하지만 진정한 의미에서의 음수와 양수를 나타내는 독립적인 사인(sign)은 아니다. 사인 비트도 바이너리 덧셈 알고리듬의 연산시 다른 비트처럼 연산과정에 참여한다.

질문 다음 4 비트는 2의 보수입니다. 이 수는 음수 입니까 양수 입니까?

1001

4비트의 음수와 양수 표현

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_22.html

답:음수

다음 사항을 분명히 이해하자. 가장 왼쪽에 있는 비트 영어로 하이 오더 비트(high order bit)가 0일때는 양수를 나타내고 1일때 음수를 표현한다는 사실은 우연적인 결과물이다. 어떤 수의 음수를 2의 보수 표현법으로 나타내기 위해서는 먼저 뒤집기(reflect)를 하고 1을 더해야 한다. 단순히 사인 비트만 바꿔서는 2의 보수로 음수를 표현할 수 없다.

2의 보수 표현법으로 쓰여진 N개의 비트를 쉽진수로 전환하기 위해서는

  1. 만일 표현한 정수가 음수일때 그 수의 양수를 구하기 위해 음수의 보수를 구하자.
2. 구해진 양수를 십진수로 전환하자. 3. N비트로 표현한 수가 음수 였다면 10진수 앞에 -를 붙이자.

1001은 사인 비트가 1이므로 음수 표현이다. 그러므로 먼저 음수의 보수를 구한다.

1001 → 0110 + 1 → 0111

결과 2진수를 10진수로 전환하자.

0111=7<10>

음수기호를 붙인다.

-7<10>

결과적으로 4비트 보수로 표현한 1001은 10진수로 -7이다. 질문: 다음의 8비트는 2진수 보수 표현법으로 표현되었다. 1001 1111. 10진수로 전환해 보자.

2의 보수로 표현할때 오버플로우 감지하기

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_23.html

답:

1001 1111 뒤집기 → 0110 0000 더하기 1 → 0110 0001

십진수로 전환하기 → 64 +32 + 1 = 97<10>

마이너스 사인 붙이기 → -97<10>

어떤 종류의 비트 패턴을 가지고도 덧셈 알고리듬을 적용할 수 는 있다. 마이크로 프로세서안에 있는 전자회로는 입력받은 두가지 비트패턴을 가지고 연산을 수행한다. 여런분이 이 비트패턴들을 입력하는것이고 프로세서는 그것을 연산할 뿐이다. 프로그래머로써 여러분은 그 연산이 정확하고 이해가 가는 연산이 되도록 명확해야 한다.

비트패턴을 표현하는 방식에따라 여러가지 다른 방법으로 오버플로우를 발견할 수 있다. 다음 예는 2진수 덧셈 알고르듬을 2개의 비트 패턴에 적용한 것이다. 한방법은 결과물을 언사인드 2진수로 해석한것이고 다른 방법은 2의 보수법 표현으로 결과물을 해석한것이다.

덧셈알고리듬을적용한 비트패턴비트패턴을 언사인드 바이너리로 해석할 경우비트패턴을 2의 보수로 해석할 경우
1111011
01110011115<10>115<10>
11010001209<10> -47<10>
|| 0100||0100||68<10> ||68<10>|| || || ||틀린 해석||옳은 해석|| 위와같이 2진수 덧셈 알고리듬을 연산수(operands)에 적용했다. 결과는 비트패턴을 어떻게 해석하는 가에따라 옳을 수 있고 틀릴 수 있다. 비트패턴을 언사인드 바이너리 정수로 생각한다면, 오버플로우가 발생한 것이다. 비트패턴을 2의 보수로 표현된 정수로 해석 한다면 올바른 결과물이다.

올바른 2의 보수 덧셈
2진수 덧셈알고리듬을 2의 보수 표현법에 적용할 경우
가장 왼쪽 행(high order column)의 캐리로 들어가는 값과 가장 왼쪽 행(high order column)의 캐리로 나오는 값이 같다면 계산은 오버플로우가 없는 정확한 계산이다
캐리 비트는 0이나 1일수 있다
질문: 다음은 2의 보수를 표현한 결과물을 설명한것 중에서 위에 답의 경우를 설명한 것은 무었읍니까? [정확한 결과] 가장 왼쪽 행의 들어가는 캐리 값과 나오는 캐리값이 동일하다. [부정확한 결과]가장 왼쪽 행의 들어가는 캐리 값과 나오는 캐리값이 다르다.

캐리 인(Carry IN)=캐리 아웃(Carry out)

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_24.html

답: [정확한 결과] 가장 왼쪽 행의 들어가는 캐리 값과 나오는 캐리값이 동일하다.

2의 보수법으로 표현한 경우 덧셈의 결과값은 가장 왼쪽행의 들어가는 캐리 값과 나오는 캐리값이 같을 경우만 오버플로우가 발생하지 않은 정확한 결과값이다. 캐리값은 0이나 1일 수 있다. 컴퓨터는 전기회로를 통해 캐리값과 나오는 캐리값을 비교해서 오버플로우가 발생했는지 확인한다. 쉬운 방법이다. 예를 더들어 보자.

attachment:overflow2.JPG

질문: 다음 2의 보수로 표현된 8비트 바이더리를 덧셈하십시요. 결과물에 오버플로우가 발생합니까?

1011 1101 1110 0101

2의 보수로 뺄셈하기

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_25.html

답:

오버플로우가 발생하지 않은 옳은 답입니다.

캐리111111 1
10111101
11100101
10100010
위의 답을 다시 살펴보자. 가장 왼쪽 행의 들어가는 캐리값과 나오는 캐리 값이 동일하기 때문에, 계산의 결과는 오버플로우가 발생하지 않은 정확한 답이다. 패턴이 나타내는 숫자를 십진수로 바꾸어 볼 필요도 없이 오버플로우가 발생했는지 안했는지 쉽게 알 수 있다. 좀더 자세히 살펴보면 결과 값을 포함해서 모든 계산이 정확하다는 것을 알 수 있다.

캐리값111111 1
1011 1101(-67<10>)
1110 0101 (-27<10>)
1010 0010(-94<10>)
2진수 덧셈 알고리듬을 덧셈과 뺄셈 모두에 적용할 수 있다. 2의 보수로 표현된 두 수를 뺄셈하기 위해서는 빼는 수를 음수화 해서(2의 보수법으로) 덧셈합니다. 오버플로우가 발생했는지 안했는지 알아보는 방법은 같은 방법을 사용합니다.

질문: 0011 0001로부터 0001 1011을 뺄셈 해보자. 결과값에 오버플로우가 발생합니까?

여러 목적으로 쓰이는 알고리듬

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_26.html

답:

0001 0110 (오버플로우가 발생하지 않는다)

뺄려고 하는 숫자는 비트 패턴을 뒤집기 하고 1을 더해서 아래와 같이 먼저 보수화된다.

0001 1011 → 1110 0101

이 보수화 된 숫자에 2진수 덧셈 알고리듬을 적용한다.

캐리값11100001
0011 0001=49<10>
1110 0101= -27<10>
0001 0110 22<10>
가장 왼쪽에 있는 행(most significant column)의 들어가는 캐리(carry)값과 나오는 캐리 값이 같기 때문에 오버플로우가 발생하지 않은 정확한 답이다. 여태까지 2진수 덧셈 알고리듬을 다음과 같은 경우에 잘 사용해 왔다.

  • 언사인드 표현된 2진수 정수를 더할때.
  • 2의 보수 표현법을 사용한 2진수 정수를 더할때.
  • 2의 보수 표현법을 사용한 2진수 정수를 뺄셈할때.
언사인드 2진수 정수를 뺄셈하는 경우에는 알고리듬을 직접 사용할 수 없다. 만양 두 언사인드 정수가 작은 수일 경우, 뺄셈 되어지는 수를 2진수 보수법 음수로 전환한 뒤에 덧셈 알고리듬을 적용할 수 는 있다.

질문: 0010 0101에서 0101 1001을 뺄셈하십시요. 오버플로우가 발생합니까?

뺄셈 연습하기

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_27.html

답:

1100 1100 (오버플로우가 발생하지 않는다)

먼저 뺄셈하려는 수의 패턴은 비트 패턴을 뒤집은 후 1을 더함으로써 음수화(negated)된다.

0101 1100 → 1010 0111

그런 후에 2진수 덧셈알고리듬을 적용한다.

캐리값00100111
0010 0101=37<10>
1010 0111=-89<10>
1100 1100 -52<10>
가장 왼쪽에 있는 행(the most significant column)의 들어가는 캐리값과 나오는 캐리값이 같은 경우이므로 오버플로우가 발생하지 않은 정확한 값이다. 답의 결과값은 음수이다.

컴퓨터 공학자와 엔지니어들은 이러한 2진수 덧셈 알고리듬을 완전히 이해하여야 한다. 연습을 열심히 해보자. 이런 것이 이해안되면 문과로 전공을 바꾸거나 군대를 같다온 뒤에 공부에 집중해보는 것도 한가지 방법이다.

질문: 1110 0101에서 0101 1001을 뺄셈해보자. 오버플로우가 발생 했습니까?

뺄셈 연습하기 2

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_28.html

답: 1000 1100 (오버플로우가 발생하지 않는 정확한 답이다)

먼저 뺄셈하려는 수의 패턴은 비트 패턴을 뒤집은 후 1을 더함으로써 음수화(negated)된다.

11100111 캐리값
11100101=-27<10>
10100111=-89<10>
10001100 -116<10>
가장 왼쪽에 있는 행(the most significant column)의 들어가는 캐리값과 나오는 캐리값이 같은 경우이므로 오버플로우가 발생하지 않은 정확한 값이다. 답의 결과값은 음수이다.

컴퓨터는 이러한 연산을 초당 몇백만번씩 수행한다. 여러분도 할 수 있다. 2초정도 시간을 내서 머리속으로 한문제 더 풀어보자.

질문: 1011 0000에서 0111 1000을 뺄셈해보자. 오버플로우가 발생 했습니까?

8장 끝

http://chortle.ccsu.edu/AssemblyTutorial/Chapter-08/ass08_29.html 답:

0011 1000 (오버플로우가 발생했다)

먼저 뺄셈하려는 수의 패턴은 비트 패턴을 뒤집은 후 1을 더함으로써 보수화(complemented)된다.

0111 1000 → 1000 0111 + 1 → 1000 1000

그런 후 덧셈 알고리듬을 적용한다.

10000000
10110000=- 80<10>
10001000=-120<10>
00111000 +56<10>!??!!
가장 왼쪽에 있는 행(the most significant column)의 들어가는 캐리값과 나오는 캐리값이 같지않은 경우이므로 오버플로우가 발생한 부정확한 값이다.

8 장에서 논의된 중요한 주제들

  • 2진수 덧셈 알고리듬 The binary addition algorithm
  • 2진수 덧셈 알고리듬의 세부사항들 Details of the binary addition algorithm.
  • 16진수 덧셈하기 Hexadecimal addition.
  • 언사인드 2진수 덧셈에서 오버플로우 감지하기 Overflow in unsigned binary addition.
  • 사인 메그너튜드 표현법 Sign-magnitude representation
  • 2의 보수 표현법 Two's complement representation
  • 2의 보수 표현법에서 사인 비트란 The sign bit with two's complement representation.
  • 2의 보수 표현법에서 오버플로우 감지하기 Overflow in two's complement addition.
| 8장퀴즈를 꼭 풀어봅시다.