UMax: 비트가 다 1인 것
UMAX= -1
UMAX-1 = -2
TMAX = MSB가 0이고 하위 모든 비트가 1인 것
TMIN = LSB가 0이고 상위 모든 비트가 1인 것
TMIN = TMAX+1
cf) 01111111(TMAX)에 +1을 하면 11111110(TMIN)
UMAX = 2*TMAX+1
cf) 01111111(TMAX)에 <<1을 하면 11111110이고, +1을 하면 11111111(UMAX)
c언어는 기본적으로 signed integers로 간주함
Unsigned는 끝에 'U'를 붙임
unsigned와 signed가 섞여 있을 때 기본적으로 c언어는 unsigned로 캐스팅 함
ex) -1과 0U를 비교했을 때 -1이 더 큰 이유는 -1이 unsigned로 캐스팅 되면 UMAX기 때문.
unsigned를 확장할 때는 0을 추가하면 됨
signed의 비트를 늘릴 때
ex) 0110를 5자리 비트로 늘리면 00110이고 값은 변함없는 6임
ex) 1110을 똑같이 확장한다고 했을 때 x1110 = -2, x = 1
즉, sign extension을 할 때 MSB가 복사 된다는 것
short를 int로 캐스팅 할 때도 같은 원리임
trucating (큰 거를 작은 거로 변환) : 상위 비트를 제거 (값의 손실)
ex) 10011 (-13) -> 0011 (3)
cf) module 연산으로 쉽게 파악할 수 있는데, -13 mod 2^4 = -13 mod 16 = 3
Unsigned Addition
s = u+v mod 2^w
TAdd Overflow (부호 값이 다른게 나올 수 있음)
ex) // 최대 4비트일 때
1101 (-5)+1011 (-6) = 10111 -> 0111 (7) // 음수가 양수로 NegOver(negative overflow)가 발생
0111 (7) + 0101 (5) = 1100 (-4) // 양수가 음수로 PosOver(positive overflow)가 발생
Unsigned Multiplication
Addition과 동일하게 범위가 넘으면 trucation 발생
ex)
w = 4bit 일 때 5x5는 25(11001)로 범위를 넘어가게 되고 trucation 발생으로 9(1001)이 됨
u * v mod 2^w으로 확인을 해보면 25 mod 16 = 9
Signed Multiplication in C
w = 4bit 일 때 5x5는 25(11001)로 범위를 넘어가게 되고 trucating 발생으로 -7(1001)이 됨 // 부호가 바뀔 수 있음
대학교 2학년 2학기/시스템 프로그래밍
Bits, Bytes, and Integers
728x90
728x90