본문 바로가기

전공 테트리스/컴퓨터구조

[컴퓨터구조] 2. 정수 Integers

1. DAC and it’s Applications

Digital-to-Analog-Converter, 디지털 아날로그 변환 회로)

  • 디지털 신호를 아날로그 신호로 변환하는 장치.

 

 

 

2. 이진 표현(Binary Representation)

  • 전자 구현 (Electronic implementation)
  • 10진수를 사용하지 않는 이유
    • 쌍안정 (bistable) 요소로 보관이 용이하다
    • 산술 함수의 간단한 구현 (Straightforward implementation of arithmetic functions)
    • 시끄럽고 부정확한 전선에서도 안정적으로 전송된다. (Reliable transmitted on noisy and inaccurate wires)

 

 

 

 

3. 정보 표현 (Representing Information)

  • Information = Bits + Context
  • 컴퓨터는 사물의 표현을 조작한다.
  • 사물은 이진수로 표현된다.
    • 2^n개
    • 숫자, 문자, 픽셀, 위치, 소스 코드, 실행 파일, 기계 명령 ..
    • 어떤 작업을 수행하는 지에 따라 다르다.N비트로 표현 가능한 것은?

 

 

4. 인코딩 바이트 값 (Encoding Byte Values)

  • Binary(이진수) : 00000000 to 11111111
    • 0b/ 0B로 시작하는 정수 상수는 C에서는 이진수.
  • Octal(8진수) : 000 to 377
    • 0으로 시작하는 정수 상수는 C에서 8진수(파이썬에서는 0o)
  • Decimal(10진수) : 0 to 255
    • 첫 번째 숫자가 0이어서는 절대 안 됨
  • Hexadecimal(16진수) : 00 to FF
    • ‘0’~’9’ 및 ‘A’~’F’ 문자를 사용한다.
    • C에서 - FA1D37B16을 0xFA1D37B / 0xfa1d37b(0x/0X)로 표시

 

 

binary → Decimal ?

  • 1이 있는 곳마다 각 자리의 값을 2^n으로 계산해서 더해준다.
    • 1111 1111 → 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
    • (다 1일 경우, 다음 자릿수 값 -1 하면 됨. 즉, 1 0000 000 -1 = 256 - 1 )

Octal → Decimal ?

  • 각 수를 2진수 3자리로 먼저 계산한다. (사실상 8진수를 한 자리 당 7까지만 가능한데, 2진수로 7은 111이므로 2진수 3자리로 바꾸는 것은 당연함.)
  • 2진수 3자리를 합쳐서 10진수로 계산하면 끝이다.
    • 0 43 → 0b 100 011 → 35

Hexadecimal → Decimal ?

  • 각 수/문자를 2진수 4자리로 먼저 계산한다. (사실상 10진수는 한 자리 당 15까지 -F가 15를 의미- 가능하므로 15는 이진수로 1111이라서 2진수 4자리로 바꾸는 건 당연함.)
  • 4자리로 바꾼 2진수를 모두 합쳐서 10진수로 계산하면 끝이다.
    • 0x D9 → 0b 1101 1001 → 217

Decimal → Octal ?

  • 10진수를 2진수로 먼저 변환한다.
  • 변환한 2진수를 맨 끝(오른쪽)부터 3칸씩 끊는다.
  • 각 3칸을 10진수 값으로 계산해서 각각 한 자리수로 적어준다.
    • 63 → 0b 0011 1111 → 0 00 111 111 → 0 111 111 → 0 77
    • 64 → 0b 0100 0000 → 0 001 000 000 → 0 100

 

 

 

5. 부호 없는 (이진) 정수(Unsigned (Binary) Integers)

  • +나 -가 존재하지 않고, 0과 자연수로 이루어져 있음.
    • → 오버플로우/ 언더플로우 발생
  • (8비트) 0b 0000 0000 ~ 1111 1111 → 0 ~ 255
  • MSB (Most Significant Bit)
  • LSB (Least Significant Bit)
  • Range : 0 ~ 2^n - 1 (n = bit 수)
    • 8비트의 경우, 2^8-1= 256 - 1 =255

 

 

6. 부호 있는 정수 (Signed Integer)

  • 음수, 0, 양수 // 넓은 숫자의 범위 표현
  • 양수 인코딩 (Encoding positive numbers)
    • (= 부호 없는 수 인코딩. Unsigned numbers)
  • 음수 인코딩 (Encoding negative numbers)
    • 부호화 절댓값 표현 (Sign-magnitude representation)
    • 1의 보수 표현 (One’s complement representation)
    • 2의 보수 표현 (Two’s complement representation)

 

 

 

7. 부호 크기 표현 (Sign-magnitude Representation)

  • 문제점 : Two Zeros (+0, -0)
  • 부동 소수점에 사용된다. (Floating Point)
  • MSB = Sign bit (positive = 0 / negative = 1)
  • n비트 - MSB = Magnitude (원래 표현하려던 수를 2진수로 표현한다.)
  • Range : -(2^(n-1)-1)~+(2^(n-1)-1)
    • (8비트): - (2^7 -1) ~ +(2^7 -1) = -127 ~ +127 (0111 1111 ~ 1111 1111)

 

 

 

8. 1의 보수 표현 (One’s Complement Representation)

 

  • 문제점 : 여전히 0이 두 개
  • 1의 보수 방법은 주어진 2진수의 0은 1로, 1은 0으로 대체한 수로 부호 절댓값 방식에서 음수의 순서를 뒤집는 1의 보수 방법을 쓰기로 한다.
  • 부호는 음수(-) 일 때, 1로 표기하고, 양수(+) 일 때, 0 으로 표기하기로 한 성질을 유지하면서, 음수와 양수를 단순히 더하는 방식으로 뺄셈을 구현할 수 있다.
  • Range : - (2^(n-1)-1) ~ +(2^(n-1)-1)

 

  • 현재 사용 x
  • (부호 절대값 방식에서 골치거리였던 것이 깔끔하게 해결된다. 부호와 절대값을 따로 계산하지 않아도 되고, 음수를 더하는 방식으로 뺄셈을 할 수 있게 된다. 단, 캐리가 발생하면 LSB(최하위비트)에 1을 더해줘야 한다.)
  • 그런데 여전히 0이 두 개인 것과 캐리를 처리해야 하는 문제가 남아있다. 즉, 0000과 1111을 둘 다 0으로 처리해야 하고, 계산과정에 캐리가 발생됐는지 감시해서 LSB에 1을 더해주는 회로를 구성해야 한다.

 

 

9. 2의 보수 표현 (Two’s Complement Representation)

 

  • 0이 하나 (1의 보수에서 값의 범위 1 증가)
  • 1의 보수 + 1
    • 3 >> 0011 → (1의 보수) 1100 → (2의 보수) 1101 = -3
  • Range : - (2^(n-1)) ~ + (2^(n-1) -1)
  • 하드웨어에 용이함 (MSB)
    • 0 ≥ 0 (0 and positive)
    • 1 < 0 (negative)
  • 거의 모든 최신 기계에서 사용
  • ( MSB가 0이면 양수, 1이면 음수라는 성질이 유지된다.음수의 비교 연산에서 발생하는 모순이 해결된다.덧셈과 뺄셈을 구현할 때 캐리를 처리하지 않아도 된다. )
  • [출처] 컴퓨터는 왜 2의보수를 사용할까|작성자 굿맨
  • 0이 두 개나 존재하는 모순이 해결된다.
  • 음수를 더하는 방식으로 뺄셈을 할 수 있다.
  • ~x + 1 = -x
    • ~x + x = -1
    • ~x + x + (-x + 1) = -1 + (-x +1)
    • ~x + 1 = -x

 

 

10. 부호 확장 (Sign Extension)

 

  • Signed : w bits → x + k bits
    • w비트가 부호 있는 정수라면,
      • 동일한 값을 갖는 w + k 비트정수로 변환
      • sign 비트는 왼쪽에 복제한다.
        • +2 : 0010 —> 0000 0000 0000 0010
        • -2 : 1110 —> 1111 1111 1111 1110
      • RISK-V instruction(명령어) set 에서
        • lb = sign-extend loaded byte
        • lbu = zero-extend loaded byte

 

 

11. RISC-V lb, lbu

lb (load byte)

lbu (load byte unsigned)

 

 

 

12. Operation

1) C의 비트 수준 연산 (Bit-Level Operation in C)

  • &, |, ~, ^ 연산
  • 비트 별로 적용

 

 

 

2) AND 연산

  • 단어의 비트를 mask 하기 편리하다
    • 일부 비트를 선택하고, 나머지는 0으로 지운다.
    • mask : 원하는 비트를 추출하기 위한 

 

3) OR 연산

  • 단어를 비트에 포함하는 데 유용하다.
    • 일부 비트를 1로 설정하고, 나머지는 고정한다.

 

4) XOR 연산

  • Differencing operation
    • 일부 비트를 1로 설정하고, 나머지는 고정한다.

 

5) C의 논리 연산 (Logic Operation in C)

  • &&, ||, !
    • 0 = “False”, 0이 아닌 모든 것 = “True”
    • 항상 1 또는 0 반환
    • if else 와 같은 조건문에 일반적으로 사용
    • 조기 종료

 

6) Shift 연산 (시험)

  • Left shift : x << y (= x2)
    • x를 y만큼 왼쪽으로 이동
      • 왼쪽의 남는 비트는 버림 - 산술 시프트의 오버플로우
    • 오른쪽을 0 으로 채운다.
    • A multiplication by a power of 2

 

  • Right shift : x >> y
    • x를 y만큼 오른쪽으로 이동
      • 오른쪽의 남는 비트 버림
    • Logical Shift (논리 시프트)
      • 왼쪽을 0으로 채운다
      • 오른쪽에 MSB 복제
      • 2의 보수 정수 표현에 유용하다
      • 대략 나누기 2와 비슷Arithmetic Shift (산술 시프트) (= / 2)

  • y < 0 , y ≥ word size 인 경우는 아직 정의되지 않았음

 

 

 

13. 정수 연산

 

 

1. 정수 덧셈 (Integer Addition)

 

  • 결과가 범위를 벗어날 경우 = 오버플로우
  • +ve and -ve : no overflow
  • two +ve : sign bit가 1이면, 오버플로우
  • two -ve : sign bit가 0이면 오버플로우

 

 

2. 정수 뺄셈 (Integer Subtraction)

  • 두 번째 피연산자(operand)의 부정(negation) 추가
  • 정수+ 정수(2의 보수)
  • two +ve / two -ve : NO overflow
  • (+ve) + ( -ve) : sign bit가 1이면 오버플로우
  • (-ve) + (+ve) : sign bit가 0이면 오버플로우

 

 

14. 멀티미디어를 위한 산술 (Arithmetic for Multimedia)

  • 그래픽, 미디어 처리는 8bit와 16bit 데이터의 벡터에서 작동한다.

SIMD (single-instruction, multiple-data)

  • 하나의 명령어로 여러 데이터를 처리할 수 있는 인텔의 기술
  • 64비트 adder 사용, with partitioned carry chain
    • operate on 8x8 bit, 4x16 bit, 2x32 bit vectors

 

 

15. ALU (Arithmetic Logic Unit, 산술 논리 장치)

  • 덧셈, 뺄셈 등의 산술 연산이나 / AND, OR 등의 논리 연산을 수행하는 장치
  • CPU내의 비트 단위 연산

 

 

곱셈 - Multiplier (시험)

A * B = Product

  • A = multiplicand (피승수)
  • B = multiplier (승수)
  • product = 곱
    • product(결과)의 길이 = 연산 길이의 합

 

 

 

  • optimized multiplier (최적화된 연산기) - 시험

회로의 단순화/ (multiplicand 레지스터, ALU레지스터 ) 64비트→ 32비트/ multiplicand-shift left / multiplier 레지스터/ multiplier는 product의 오른쪽에 배치/ product의 왼쪽은 모두 0으로 초기화

  • 단계를 병렬로 수행 : 추가 + 이동
  • 64bit → 32bit로 감소
  • 부품 추가 당 1 사이클
    • 곱셈 빈도가 낮으면 괜찮다.

 

 

  • Faster multiplier
    • 곱셈 연산 시 adder를 여러개 사용하면 빠른 곱셈이 가능하다. 그러나 하드웨어 리소스를 많이 사용하게 되어 비용이 증가한다. - (31iteration = 31 ALU)
      • (비용과 성능의 tradeoff)
    • 파이프라인 사용 시 적은 하드웨어 비용으로 높은 성능을 낼 수 있다. (여러 곱셈의 병렬 계산)

 

 

분할 (Division)

 

 

 

  • optimized divider (시험⭐⭐⭐⭐⭐)
    • Divisor register 64 → 32 bit
    • ALU registor 63 → 32 bit
    • Quetient register → Remainder Register의 오른쪽에 위치
    • Divisor shift right → shift는 이제 remainder 레지스터 한 번만 수행

  1. remainder - division ≤ 0 ? (= 빼고 난 값의 MSB가 1인가)

[기존 remainder로 복귀 && {(remainder<<1) && (Quotient의 LSB = 0 )}] : {(remainder<<1) && (Quotient의 LSB = 1 )}

  • 뺄셈(-) 연산 : remainder + (division의 1의 보수 + 1, 즉 2의 보수)

 

 

 

 

 

 

 

 

 

 

참고

 

컴퓨터는 왜 2의보수를 사용할까

알고리즘 문제 공부중, 나누기 연산자를 사용하지 않고, 나누기 구현을 공부하다 컴퓨터의 기본적인 덧셈/...

blog.naver.com

 

 

컴퓨터에서의 정수표현 (부호있는 정수, 2의 보수)

컴퓨터에서는 정수, 실수, 문자, 이미지, 동영상, 소리를 어떻게 표현하는가? 오늘은 컴퓨터 내부의 데이터 표현에 대해 생각해 보려고 한다. 우리가 지금 보고 있는, 무수히 많은 문자, 이미지,

sudo-minz.tistory.com

 

 

컴퓨터는 왜 2의보수를 사용할까

알고리즘 문제 공부중, 나누기 연산자를 사용하지 않고, 나누기 구현을 공부하다 컴퓨터의 기본적인 덧셈/...

blog.naver.com

 

 

[컴퓨터 구조] Multiplication

앞의 글을 읽으시면 이해에 도움이 됩니다. 2022.10.22 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Add, Sub, OverFlow [컴퓨터 구조] Add, Sub, OverFlow 1. Addition bit에서의 덧셈은 십진수의 덧셈과 매우 흡사

hi-guten-tag.tistory.com

 

 

[컴퓨터 구조] Division

앞의 글을 읽으시면 이해에 도움이 됩니다. 2022.10.22 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Add, Sub, OverFlow [컴퓨터 구조] Add, Sub, OverFlow 1. Addition bit에서의 덧셈은 십진수의 덧셈과 매우 흡사

hi-guten-tag.tistory.com