정수의 표현 방법
unsigned int
- 부호가 없는 정수, 주어진 저장장소에 이진수로 표현
BCD 코드
- 4 bit로 십진수 0~9를 표시
- e.g. 235110 = 0010 0011 0101 0001 (BCD)
부호 - 크기: MSB에 의한 부호 표시
- e.g. -2210 = 11011010
signed
- 부호를 갖는 수의 표현, 부호 - 크기, 1의 보수, 2의 보수로 표시 가능
컴퓨터에서는 2의 보수로 부호형 정수를 표시하기로 정했습니다
- 비부호형 수에서 2의 보수형 정수로 변환하는 방법
: 비트를 모두 뒤집고, 1을 더합니다. (= ~n + 1)
정수의 인코딩
비부호형 정수
B2U(X) = Σi=0(w−1)xi∗2i
부호형 정수 (2의 보수)
B2T(X) = −xw−1∗2w−1 + Σi=0(w−2)xi∗2i
short int x = 15213;
short int y = -15213;
2의 보수 방식에서 MSB는 부호를 나타냅니다
길이가 W bits인 정수의 표현 가능 범위
- Unsigned Values
- UMin = 0 (000...0)
- UMax = 2w - 1 (111...1)
- Two's Complement Values
- TMin = -2w−1 (100...0)
- TMax = 2w−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
- 비트 표현에는 변화가 없음
- 양수는 변화가 없음
- 음수는 양수로 변환됩니다
C언어에서 signed, unsigned 변환
상수
- 아무런 명시가 없으면 signed integer이고
- 명시적으로 U를 숫자 끝에 붙이면 수식 전체가 Unsigned integer로 인식합니다.
타입변환 Casting
int tx, ty;
unsigned ux, uy;
tx = (int) ux;
uy = (unsigned) uy;
tx = ux;
uy = ty;
Casting 충격
- signed와 unsigned 값들이 한 개의 수식 내에 섞여 있는 경우 implicit하게 unsigned로 바뀝니다.
- 비교연산자에서도 이런 현상이 발생합니다 (<, >, ==, <=, >=)
- signed 값이 unsigned로 casting 될 때 크기 순서가 뒤바뀝니다. (e.g. 음수가 매우 큰 양수로 바뀌는 경우)
비부호형의 덧셈
- 일반적인 덧셈 연산과 동일
- Carry는 무시 (Carry란 MSB에서 발생하는 자리올림을 의미)
- mod 함수로 표시 가능
- s = UAddw(u, v) = (u + v) mod 2w
- x + y의 값이 2w - 1보다 크면 Overflow가 발생합니다
부호형(2의 보수)에서의 덧셈
Overflow 찾아내기
-
목표
- s = TAddw(u, v) 일 때,
- s = Addw(u, v) 성립여부 체크
Overflow iff either:
- u, v < 0, s ≥ 0 (NegOver)
- u, v ≥ 0, s < 0 (PosOver)