unsigned char ch;
char ch;
난 배울 때 unsigned는 2의 보수 표기법에서 MSB까지도 크기를 나타내는데 쓰는걸로 알고 있거든
근데 MSB까지도 크기를 나타내는데 쓰든, 그렇지 않든 결국은 해석의 차이 아님?
예를 들면, unsigned char형 데이터에 200이라는 값을 넣든 그냥 char형 데이터에 200이라는 값을 넣든
실제 데이터에 들어가는건 MSB에 1이 들어간 c8이 들어가게 됨.
그럼 결국 데이터를 어떻게 쓰던 간에 해석만 잘 하면 되는거 아녀?
unsigned를 안붙여도, 그냥 char형 데이터를 unsigned처럼 쓰고나서, 만약 이를 출력할 일이 있으면
printf에서 서식을 unsigned로 지정해주면 되잖아
그럼 왜 굳이 unsigned, signed라고 변수 선언에서 명시를 하는거?
그냥 가독성 때문? 내가 이 데이터를 unsigned로 취급할 것이다?
-----------------------------------------------------------------------------------
어셈블리어에서는 high level language가 가지고 있는 형(type)에 대한 개념이 없다.
데이터가 어떻게 생각되느냐는 그 데이터에 어떠한 명령이 사용되는지에 달려 있다.
반면 C 언어와 같은 경우에는 부호 있는 정수(signed)와 부호 없는 정수(unsigned)를 정의한다.
이는 C 컴파일러로 하여금 그 데이터에 정확한 명령을 내리게 해준다.
unsigned char uchar = 0xFF;
signed char schar = 0xFF;
int a = (int)uchar;
int b = (int)schar;
다음의 결과로, a에는 255(0x000000FF)가 들어가는 반면, b에는 -1(0xFFFFFFFF)가 들어간다.
즉, 데이터의 크기를 늘리는 작업을 할 경우에는 정수에 부호가 있는가 없는가의 유무가 중요한 영향을
끼치게 된다.
이 외에도 산술 연산이나 대입 연산시에도 정수의 부호유무가 결과를 만드는데 중요할 수 있는데,
이부분은 아마 대입이나 산술 연산 시의 묵시적(implicit) 형변환 때문에 그런것이 아닌가 생각한다.
음..그러니까 컴파일러에게 이러한 작업을 할 경우를 위해 미리 알려준다는 거지..
결론은 high level language에서는 singed / unsigned의 선언 유무가 중요하고 의미를 가진다!
추가 : 선언한 변수를 쉬프트 시킬경우에도 signed / unsigned에 따른 차이가 있다.
signed라면 이 때 쉬프트 연산은 산술적 쉬프트 연산 (arithmetic shift operation) 이지만,
unsigned라면 이 때 쉬프트 연산은 논리적 쉬프트 연산이 된다.
산술적 쉬프트 연산은 부호비트를 제외한 나머지 비트들을 쉬프트 하기 때문에 부호를 유지시킨다.
반면 논리적 쉬프트 연산은 단순하게 비트들을 전부 쉬프트 하기 때문에 unsigned 데이터에 쓰인다.
'C > 공개글' 카테고리의 다른 글
MinGW에서 pthread 사용하기 + 주의사항 (0) | 2014.09.19 |
---|---|
fgetc 함수의 리턴 값은 왜 int형인가 (fgetc(), getc() and getchar()) (0) | 2013.07.16 |
configure, make, make install (0) | 2013.05.13 |
배열의 포인터 변수를 선언하는 법 (0) | 2013.05.12 |
static 함수 (0) | 2013.05.03 |