아래의 코드를 살펴보자.
#include <stdio.h>
int main() {
int s = 0;
int i;
for (i = 1; i <= 10; i++) {
s += i;
}
printf("%d", s);
}
#include <stdio.h>
int main() {
char s = 0;
int i;
for (i = 1; i <= 10; i++) {
s += i;
}
printf("%d", s);
}
두 코드의 차이점은 s가 int, char
즉 타입이 다르다는 것이다.
그렇다 해도 int와 char은 메모리에 정수 숫자를 저장할 수 있어서 실행결과도 같다.
하지만 5050을 출력한다면 어떻게될까?
#include <stdio.h>
int main() {
int s = 0;
int i;
for (i = 1; i <= 100; i++) {
s += i;
}
printf("%d", s);
}
5050이 출력됨.
#include <stdio.h>
int main() {
char s = 0;
int i;
for (i = 1; i <= 100; i++) {
s += i;
}
printf("%d", s);
}
-70이 출력됨
5050을 출력하는 코드를 작성하였지만 char 타입인 s의 코드는 -70을 출력하였다.
답부터 설명하자면,
char은 -128부터 +127까지 표현이 가능하기에 5050은 표현이 불가능하다.
255가지의 정수 숫자를 표현할 수 있기에
-128부터 +127까지 표현이 가능하다는 말이다.
그러면 char 타입으로 128을 출력하면 어떻게 될까?!
#include <stdio.h>
int main() {
char s = 128;
printf("%d", s);
}
-128이 출력되는 것을 확인할 수 있다.
왜일까?!
예를 들어 3비트의 타입이 있다고 가정해보자.
이 부분에서 반을 나누어 4567 부분을 택한다.
하지만 우리는 4567을 음수로 처리하는 것이 아닌
0123 순서로 음수를 처리해야한다.
그래서 이와 같이 나타낼 수 있다.
하지만 아직 끝난 것이 아니다.
아주 예전에 다루었던 1의 보수, 2의 보수 과정을 거쳐야 한다.
이와 같은 과정을 거쳐서 01234567 을
-4, -3, -2, -1, 0, 1, 2, 3
으로 표현할 수 있다.
결론적으로 하고자 하는 말은
1의 보수와 2의 보수를 취해서 값을 얻을 수 있다.
그리고..
양수만 표현하게 하려면 (절대값 형태)
타입 앞에 unsigned 를 붙여준다.
char 형태는 255 개의 숫자 (-128 ~ +127) 가능하니
unsigned char 형태는 0 ~ 255 까지 표현이 가능하다.
#include <stdio.h>
int main() {
unsigned char s = 127;
s += 1;
printf("%d", s);
}
128 출력됨.
----------참고----------
<limit.h> 헤더코드를 이용해
아래의 값도 알아볼 수 있다!
#include <stdio.h>
#include <limits.h>
int main() {
int i = INT_MAX;
int j = INT_MAX + 1;
unsigned int k = UINT_MAX;
printf("%d\n", i);
printf("%d\n", j);
printf("%d\n", k);
}
https://book.naver.com/bookdb/book_detail.nhn?bid=8187381
'프로그래밍 언어 > C언어' 카테고리의 다른 글
C언어 - static (0) | 2021.02.15 |
---|---|
C언어 - 전역변수, 지역변수 (0) | 2021.02.06 |
C언어 - 배열 문법 (0) | 2021.01.25 |
C언어 - 배열과 함수 (0) | 2021.01.24 |
C언어 - 배열의 시작 (0) | 2021.01.20 |