int 형에서 signed , unsigned 의 차이는 부호 비트에 있다고 흔히 생각한다.
제일 앞에 있는 1bit 가 1이면 음수로 생각하는 것이 signed 라고 단순하게 생각 하곤 한다.
그렇다면
c 언어에는 unsigned char 라는 형태의 변수가 존재한다.
char 는 문자를 입력 받기 위한 변수이지만 unsigned 는 무슨 말인가 ? 애초에 문자에 부호가 존재 할 수 있는 것인가 ? 라는 질문을 가져 보길 바란다.
int main()
{
int iNum = 0xABCD1234;
char* cP = &iNum;
unsigned char* uP = &iNum;
printf("*cp [%02X]\n", *cP);
printf("*up [%02X]\n", *uP);
++cP;
++uP;
printf("*cp [%02X]\n", *cP);
printf("*up [%02X]\n", *uP);
++cP;
++uP;
printf("*cp [%02X]\n", *cP);
printf("*up [%02X]\n", *uP);
return 0;
}
위의 예제를 보면 unsigend char 와 그냥 char 의 차이점을 명확히 보여준다.
포인트를 1byte 씩 움직이면서 16 진수 2 자리를 출력하는 예제이다. (1byte = 16 진수 2자리 )
위의 예제를 좀더 깊게 이해하기 위해서는 데이터가 어떻게 메모리에 저장되는지 알 필요가 있다.
위의 iNum 의 주소를 보면 ABCD1234 데이터가 bigendian 방식으로 거꾸로 저장되어 있는 모습을 볼 수있다. 주소에서 부터 1자리 씩 읽어 왔기 때문에 34 -> 12 -> cd -> ab 순으로 출력 되는 부분을 알 수 있을 것이다.
하지만 갑자기 그냥 char 변수의 경우 FFFFFFCD 가 출력 된다. ?!
이는 16 진수를 2진수로 변환 해보면 간단히 답이 나온다.
cd 의 경우 2진수로 변화 하면 위와 같다 . 결국 부호 비트가 1인 것이다.
결국 데이터가 넘어 갈때 singed 자료형이 음수인 경우 cpu 는 레지스트의 나머지 bit를 모두 1로 가득 채운다.
여기서 cpu 는 4byte 단위로 메모리를 읽으므로 나머지 3byte 에 F 가 가득 채워진
FFFFFF 가 출력 되는것이다.
결국 데이터를 그대로 가져 오기 위해서는 꼭 unsigned 형태의 자료형을 사용해야 한다.
'공부,일 > c언어' 카테고리의 다른 글
Linked List 구현 (0) | 2021.06.14 |
---|---|
파일도 결국 1과0으로 이루어지 데이터이다. (0) | 2021.06.13 |
c 언어 공부 추천 블로그 (0) | 2021.06.09 |
랜덤 액세스 :fseek(),ftell() (0) | 2021.06.07 |
파일 입출력 (0) | 2021.06.06 |
댓글