일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- C언어
- 동적할당
- Double
- iF
- While
- Class
- 42Seoul
- vs코드 단축키
- for
- python
- docker
- phpmyadmin
- 자료형
- 패킹
- 42
- 42서울
- cout
- 포인터
- nginx
- 구조체
- jupyter 단축키
- 함수
- 42cursus
- list
- libft
- C++
- ft_server
- else if
- 2차원배열
- float
- Today
- Total
Developer
3.(C언어) 자료형_정수 본문
자료형 |
크기 |
범위 |
char |
1byte |
-128~127 |
unsigned char |
1byte |
0~255 |
int |
4byte |
-2,147,483,648 ~ 2,147,483,647 |
unsigned int |
4byte |
0 ~ 4,294,967,295 |
이전 글에서 말했듯이 unsigned는 부호가 없는 자료형을 말한다.
어렵게 생각할 필요 없다. 크기는 부호가 있으나 없으나 똑같으므로 0부터 시작한다는 것만 생각하면 된다.
#include<stdio.h>
int main(){
char num1=-10;
int num2 =-3215151;
long long num3 = 555555555555555;
printf("%d %d %lld",num1,num2,num3);
return 0;
}
long long 타입의 변수를 출력하기 위해 %lld 서식 지정자를 사용하였다.
만약 long long 타입의 변수를 %d로 출력하면 어떻게 될까?
num3의 값이 기대하던 값과 다르다 왜 그럴까?
num3의 값을 이진수로 표현하면 1 1111 1001 0100 0110 0101 1011 1000 1010 1011 1000 1110 0011
이다. %d는 4byte 용 정수 서식 지정자 이므로 하위 4byte 즉 32bit만 출력된다. 하위 32bit는
0101 1011 1000 1010 1011 1000 1110 0011이고 이 값은 실행 결과에서 나온 1535817955이다. 이처럼 서식 지정자를 잘못 지정하게 된다면 원하는 값이 나오지 않고 전혀 엉뚱한 값이 나오므로 주의를 해야 한다.
이번엔 만약 범위를 넘게 된다면 어떻게 될지 알아보자.
char의 최댓값은 127이고 unsigned의 최댓값은 256이다. 최댓값보다 1씩 많은 값을 넣어서 확인해보자.
#include<stdio.h>
int main(){
char a=128;
unsigned char b=256;
printf("%d %u\n",a,b);
return 0;
}
최대 표현할 수 있는 범위를 넘어서서 가장 최솟값이 출력 되었다. 그렇다 C에서는 범위를 넘어서면 다시 최솟값부터 다시 시작하게 된다. 반대로 최소값의 범위보다 작은 값을 입력하면 최댓값부터 다시 시작하게된다. 이렇게 최댓값을 넘어서는 것을 오버 플로라고 최솟값보다 작아지는 것을 언더 플로라고 한다.
하나의 변수를 출력하는 경우에는 이러한 실수를 하지 않겠지만 곱셈이나 제곱 등의 연산을 수행할 때 자료형의 크기를 충분히 생각하고 변수를 선언하고, 연산을 수행해야 한다. 그렇다면 자료형의 크기는 어떻게 알 수 있을까? 자료형마다 크기를 외워야 하나? 물론 양이 많지 않아서 외우는 것도 하나의 방법이지만 운영체제, 플랫폼마다 자료형의 크기가 다르기 때문에 좋은 방법은 아니다.
자료형의 크기
자료형의 크기를 구하기 위해서는 sizeof 연산자를 사용하면 된다.
sizeof 연산자는 해당 표현식 혹은 자료형의 크기를 byte로 알려준다. sizeof(자료형) 혹은 sizeof(표현식) 형식으로 사용한다. 여기에서 표현식은 변수, 상수, 배열등을 뜻한다.
#include<stdio.h>
int main(){
int num;
int size1,size2;
size1=sizeof(num); //표현식
size2=sizeof(int); //자료형
printf("%d %d",size1,size2);
return 0;
}
두 가지 방법 모두 같은 결과가 나온 것을 볼 수 있다. 맨 위의 표를 살펴보면 int형의 크기는 4byte가 맞는것을 알 수 있다. sizeof 연산자의 결과는 코드3 처럼 변수에 대입해서 사용해도 되지만 직접 사용할 수도 있다.
#include<stdio.h>
int main(){
int num;
printf("%d %d",sizeof(num),sizeof(int));
return 0;
}
정리
1. 언더 플로, 오버플로를 조심하자
2. 자료형의 크기는 운영체제, 플랫폼마다 다르므로 sizeof 연산자로 확인하자
3. 마지막으로 적겠다. 구문의 끝에 세미콜론(;)을 작성하자
'Programming Language > C' 카테고리의 다른 글
6.(C언어) 진법, 음수표현 (0) | 2020.08.01 |
---|---|
5.(C언어) 자료형_문자 (0) | 2020.08.01 |
4.(C언어) 자료형_실수 (0) | 2020.08.01 |
2.(c언어) 자료형과 변수 그리고 출력 (0) | 2020.08.01 |
1.(c언어) Hello World! (0) | 2020.08.01 |