1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<stdio.h> int main() { unsigned char uc = -8; signed char sc=-8; printf("unsigned char : %d\n" , uc); //248 printf("signed char : %d\n",sc); //-8 unsigned int iuc = -1; signed int isc=-1; printf("unsigned int : %d\n" , iuc); //-1 printf("signed int : %d\n",isc); //-1 short ss = 0x8c; signed char sc = 0x8c; printf("%d\n",(int)ss); //140 printf("%x",(int)sc); //ffffff8c return 0; } | cs |
|
unsigned char |
signed char |
범위 |
0~255 |
-128~127 |
공통점 |
1byte로 2진수로 표현하면 1000 1000 ->(부호 비트 제외한 2의 보수) 1111 1000 |
|
차이점 | 부호 비트가 없으므로 248 (128+64+32+16+8) | 첫 번째 비트는 부호 비트로 1은 음수이므로 -8 (-128+64+32+16+8) |
*char 타입은 다른 타입들과 달리 signed/unsigned가 명시되어 있지 않습니다.
그래서 가급적이면 명시를 해서 사용하는 것이 좋습니다.
|
unsigned int |
signed int |
범위 |
0~4294967295 |
-2147483648~2147483647 |
공통점 |
4byte로 2진수로 표현하면 1000 0000 0000 0000 0000 0000 0000 00001 (부호 비트 제외한 2의보수) 1111 1111 1111 1111 1111 1111 1111 1111 |
*출력 포맷 형식인 %d는 기본적으로 signed int형으로 명시 되어있습니다.
그래서 unsigned int에서 -1을 넣어도 첫 번째 비트를 부호 비트로 인식하여 signed int과 같은 방식으로 처리되어 결과값이 -1이 나옵니다.
*정수의 승격(Integral Promotion)
short ss = 0x8c; 는 0000 0000 1000 1100 입니다.
(int)ss 하면 정수 승격이 발생하여 0000 0000 0000 0000 0000 0000 1000 1100 이 된다.
(이때, short는 2byte이므로 나머지 2byte는 최상위비트로 공간을 채웁니다.)
%d 이고 양수이므로 바로 출력하면 140 이 됩니다.
char sc = 0x8c; 는 1000 1100 입니다.
(int)sc 하면 정수 승격이 발생하여 1111 1111 1111 1111 1111 1111 1000 1100 이 된다.
(이때, char 는 1byte이므로 나머지 2byte는 최상위비트로 공간을 채웁니다.)
%x 이므로 16 진수이므로 바로 출력하면 ffff ff8c 이 된다.
==>될수 있으면 int형을 사용하는 것이 성능면에서 효율적입니다.
'Embedded C언어' 카테고리의 다른 글
[임베디드 C언어_Day6]LED + keypad(비트필드 구조체 사용)구현 (0) | 2018.10.15 |
---|---|
[임베디드 C언어_Day5]CallBack (0) | 2018.10.15 |
[임베디드 C언어_Day4]LED + keypad 구현 (1) | 2018.10.15 |
[임베디드 C언어_Day3]교차 개발(cross development)(linux + Tera Term) (0) | 2018.10.11 |
[임베디드 C언어_Day2]Bit Setting 개념 (0) | 2018.10.11 |