컴퓨터 시스템에서는 크게 signed와 unsigned 자료형이 있는데 두 차이는 정수만 의미 하는지(0~255) 음수+정수 의미 하는지의 (-127 ~ 127) 차이.
1byte는 256가지의 수를 가질 수 있는 공간.
음수가 필요없는 시스템에서 signed 자료형을 쓴다면 메모리의 반절을 손해보는 것.
단순 bit공간 차이 각 뒤 숫자만큼에 bit를 사용할수 있는 공간을 의미함.
signed - Binary to Two's Complement(B2T)
unsigned - Binary to Unsigned(B2U)
Binary: 1011 1001
B2T: -2^7 + 2^5 + 2^4 + 2^3 + 1= −128+32+16+8+1 = −71
책에서 하도 어렵게 써놨는데 그냥 맨앞비트가 있으면 -2^자릿수 하면 된다.
| 값 이름 | 공식 | 예: 8비트 기준 |
|---|---|---|
TMin | −2^(w−1) | −128 (10000000) |
TMax | 2^(w−1) − 1 | 127 (01111111) |
UMax | 2^w − 1 | 255 (11111111) |
TMin = 부호형 최소값
TMax = 부호형 최대값
UMax = 비부호형 최대값
#include <stdint.h>
#include <stdio.h>
int main(){
int8_t a = 127;
int8_t b = 128;
int8_t c = 129;
printf("a = 127 : %d \n ",a);
printf("b = 128 : %d \n ",b);
printf("c = 129 : %d \n ",c);
return 0;
}


참고만하자..
앞서 설명한 것은 2의 보수로 부호를 표현한 식이고
1의 보수로도 표현한다고 하는데 거의 모든 컴퓨터 시스템에서 2의 보수를 쓴다고 하니 굳이 알아보진 말자
C에서 비트 확장은 데이터를 더 큰 자료형으로 이식할 때, 사용한다.
int8_t a = -15; // 8비트 signed
int16_t sa = a; // 16비트 signed ← 자동 sign-extension
라는 형변환이 필요할때 C에서 자동으로 늘어난 만큼 비트를 채워준다.
(앞 부호에 따라서 비트가 채워짐)
8bit: 0011 1111
16bit확장: 1111 1111 0011 1111
int16_t sa = (a & 0x80) ? (0xFF00 | a) : a;
내부적으로 위에 과정과 같이 채워진다고 한다.
비트 확장과 반대로 큰 수에서 작은 수로 비트를 쪼개서 쓰고 싶을 때 사용한다.
16bit: 0000 1111 1111 0001
8bit: 1111 0001
16bit -> 8bit 으로 쪼갠다면 하위 8bit만 사용
int16 x = 0x0FF1; // 16비트 값: 0x0FF1 = 4081
int8_t y = (int8_t) x; // y == 0xF1 == -15 (2의 보수로 해석됨)