System Programming - 3. 정수의 표현 방법

ensalada.de.pollo·2024년 2월 25일
0

SystemProgramming

목록 보기
3/3

정수의 표현 방법

unsigned int

  • 부호가 없는 정수, 주어진 저장장소에 이진수로 표현

BCD 코드

  • 4 bit로 십진수 0~9를 표시
  • e.g. 235110_{10} = 0010 0011 0101 0001 (BCD)

부호 - 크기: MSB에 의한 부호 표시

  • e.g. -2210_{10} = 11011010_{10}

signed

  • 부호를 갖는 수의 표현, 부호 - 크기, 1의 보수, 2의 보수로 표시 가능

컴퓨터에서는 2의 보수로 부호형 정수를 표시하기로 정했습니다

  • 비부호형 수에서 2의 보수형 정수로 변환하는 방법
    : 비트를 모두 뒤집고, 1을 더합니다. (= ~n + 1)

정수의 인코딩

비부호형 정수

B2U(X) = Σi=0(w1)xi2i_{i=0}^{(w-1)}x_i*2^i

부호형 정수 (2의 보수)

B2T(X) = xw12w1-x_{w-1}*2^{w-1} + Σi=0(w2)xi2i_{i=0}^{(w-2)}x_i*2^i

short int x = 15213;
short int y = -15213;
/* x
	hex: 3B 6D
    Binary: 00111011 01101101
   y
    hex: C4 93
    Binary: 11000100 10010011 */

2의 보수 방식에서 MSB는 부호를 나타냅니다

  • 0이면 양수
  • 1이며 음수

길이가 W bits인 정수의 표현 가능 범위

  • Unsigned Values
    • UMin = 0 (000...0)
    • UMax = 2w^w - 1 (111...1)
  • Two's Complement Values
    • TMin = -2w1^{w-1} (100...0)
    • TMax = 2w1^{w-1} - 1 (011...1)

데이터 타입 변환 casting

C언어에서는 signed로부터 unsigned로의 변환을 허용

short int x = 15213;
unsigned short int ux = (unsigned short) x;
short int y = -15213;
unsigned short int uy = (unsigned short) y;
Result
  • 비트 표현에는 변화가 없음
  • 양수는 변화가 없음
    • ux = 15213
  • 음수는 양수로 변환됩니다
    • uy = 50323

C언어에서 signed, unsigned 변환

상수

  • 아무런 명시가 없으면 signed integer이고
  • 명시적으로 U를 숫자 끝에 붙이면 수식 전체가 Unsigned integer로 인식합니다.

타입변환 Casting

  • 명시적 casting
int tx, ty;
unsigned ux, uy;
tx = (int) ux;
uy = (unsigned) uy;
  • 묵시적 castring
tx = ux;
uy = ty;

Casting 충격

  • signed와 unsigned 값들이 한 개의 수식 내에 섞여 있는 경우 implicit하게 unsigned로 바뀝니다.
  • 비교연산자에서도 이런 현상이 발생합니다 (<, >, ==, <=, >=)
  • signed 값이 unsigned로 casting 될 때 크기 순서가 뒤바뀝니다. (e.g. 음수가 매우 큰 양수로 바뀌는 경우)

비부호형의 덧셈

  • 일반적인 덧셈 연산과 동일
  • Carry는 무시 (Carry란 MSB에서 발생하는 자리올림을 의미)
  • mod 함수로 표시 가능
  • s = UAddw_w(u, v) = (u + v) mod 2w^w
  • x + y의 값이 2w^w - 1보다 크면 Overflow가 발생합니다

부호형(2의 보수)에서의 덧셈

  • 비부호형에서의 덧셈과 동일하게 수행
    • C에서 부호형과 비부호형의 덧셈
      int s, t, u, v;
       s = (int) ((unsigned) u + (unsigned) v);
       t = u + v;
    • s == t 동일한 결과를 얻게 됩니다.

Overflow 찾아내기

  • 목표

    • s = TAddw_w(u, v) 일 때,
    • s = Addw_w(u, v) 성립여부 체크

Overflow iff either:
- u, v < 0, s ≥ 0 (NegOver)
- u, v ≥ 0, s < 0 (PosOver)

0개의 댓글