[C] int 그리고 음수의 표현에 대한 이해
2024. 7. 27. 16:41ㆍMemorizing/C
728x90
만약 아래와 같이 프로그램을 작성하면 결과가 원하는대로 나오지 않는다.
#include<stdio.h>
int main(void){
unsigned int a;
a = 4294967295;
printf("%d\n", a);
a = -1;
printf("%u\n", a);
return 0;
}
첫 번째 a에는 -1이, 두 번째 a에는 4294967295이 찍히는데, 그 이유가 뭘까 ?
C에서 int형은 4바이트만큼 메모리를 차지하게 되는데, usigned int는 0~2^32 - 1 만큼의 숫자를 표현할 수 있고, int는 -2^31 ~ 2^31 -1만큼의 숫자를 표현할 수 있다. 부호가 있는 int형의 경우, 첫 번째 비트는 부호비트로 1이면 음수, 0이면 양수를 나타낸다.
4294967295는 2^32으로 11111111 11111111 11111111 11111111인데, unsigned int의 경우 모두 숫자로 인식하여 2^32을 정확하게 표현할 수 있다. 하지만, int 같은 경우 첫 번째 비트를 부호비트로 인식하여 음수로 인식하게 된다. 이것이 어떤 음수인지를 알아보기 위해 2의 보수법을 반대로 수행한다.
- 11111111 11111111 11111111 11111111에서 1을 뺀다. -> 11111111 11111111 11111111 11111110이 된다.
- 1의 보수를 계산한다. -> 00000000 00000000 00000000 0000001
- 10진수로 변환한다. -> 1
- -부호를 붙인다. -> -1
따라서 int형에서는 4294967295 즉, 11111111 11111111 11111111 11111111는 -1임을 알 수 있다.
따라서 만약 의도대로 출력하고 싶으면 아래와 같이 수정해야할 것이다.
#include<stdio.h>
int main(void){
unsigned int a;
a = 4294967295;
printf("%u\n", a);
a = -1;
printf("%d\n", a);
return 0;
}
'Memorizing > C' 카테고리의 다른 글
[C] 문자열과 배열 (0) | 2024.07.28 |
---|---|
[C] 배열 인덱싱 연산자 (0) | 2024.07.28 |
[C] 포인터 변수를 사용하는 swap 함수의 이해 (0) | 2024.07.28 |
[C] 왜 scanf에서는 주소값을 인자로 받는가 ? (0) | 2024.07.27 |