본문 바로가기
공부,일/c언어

signed Vs unsigned

by fromnothing1 2021. 6. 13.

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

댓글