티스토리 뷰
오늘의 포스팅 주제!!!
지난 시간에 설명드린 자료형에 대해 보충 설명을 포스팅합니다.
자료형은 정수 자료형 과 실수 자료형 문자 자료형 세 가지가 있습니다. 오늘은 정수 자료형에 대해서 이야기 해보겠습니다.
정수 자료형의 종류는 다양하게 있지만 크게 구분하면 int 와 char 으로 구분이 가능합니다. 그리고 부호와 크기를 조합하여 원하는 크기와 범위를 선택 할 수 있습니다.
부호는 여러분이 아는 플러스(+) 와 마이너스(-) 입니다. 여기서는 보호가 있는 정수와 부호가 없는 정수로 구분하는데 당연히 부호가 없는정수가 0부터 시작한는 정수이겠죠?
그러면 반대로 부호가 있는 정수는 플러스와 마이너스를 모두 가지고있는 정수가 됩니다.
자료형의 부호
signed : 부호가 있는 정수로 표시합니다. 보통 singed키워드는 생략이 가능합니다.
unsigned : 부호가 없는 정수로 표시합니다. 0부터 시작하는 양의 정수값으로 표시하며 생략은 할 수 없습니다.
크기는 자세하게는 길이 라고 말을 할 수 있습니다. 크기는 short 와 long 으로 구분하며 long은 4바이트 부터 사용합니다.
여기서 바이트(bite)는 비트(bit)로 작게 구분할 수 있습니다.
1bite = 8bit 라고 생각하시면 됩니다.
정수 자료형의 크기와 범위를 표로 정리한 결과 입니다. 자료형 / 크기 / 범위 / 비고 순서입니다.
표를 외우실 필요는 없습니다. 필요할 때마다 찾아서 확인하시면 됩니다.
표의 규칙을 찾아 보시면 이해하시는데 도움이 되실 겁니다. 위에서 설명했던 것 처럼 부호가 있는 경우와 없는 경우 범위의 차이 그리고 4바이트 부터는 short가 없고 대신에 long이 사용되며 long을 두번 중복으로 사용이 가능합니다.
자료형을 사용하여 값을 저장하는것도 중요하지만 화면에 출력하는것도 중요합니다.
우리가 알고있는 printf 연산자를 사용하여 자료형을 출력하려면 서식 지정자를 같이 사용해야합니다.
singed 자료형에서의 서식지정자
%d : 10진수(decimal) 의 약어로 d를 사용합니다.
%lld : long decimal 의 약어로 ld를 사용합니다.
%lld : long long decimal 의 약어로 lld를 사용합니다.
unsinged 자료형에서의 서식지정자
%u : 부호없는(unsigned decimal) 10진수의 약어로 u를 사용합니다.
%lu : long unsigned decimal 의 약어로 lu를 사용합니다.
%llu : long long unsigned decimal 약어로 llu를 사용합니다.
중요한건 사용자가 원하는 단어 혹은 정수의 크기 즉 저장된 값이 범위 안에 들어가있어야 한다는 것입니다.
만일 저장된 값이 범위 밖에 있을 경우 이를 오버플로우 / 언더플로우 라고 합니다.
오버플로우 / 언더플로우 를 이해하기 위해서는 아래 코드를 먼저 입력해 봅시다.
#include <stdio.h>
int main()
{
char num1 = 128;
unsigned char num2 = 256;
printf("%d %u\n", num1, num2);
return 0;
}
사용자는 128과 256을 출력하려 했으나 실제 출력된 값은 -128과 0 입니다.
이런 오류를 C언어에서는 오버플로우 / 언더플로우 라고합니다.
char의 범위는 -128 ~ 127 이지만 num1의 값은 128 입니다. 범위 밖으로 넘어간 값이 범위보다 1 많아 범위를 넘어 다시 최솟값 -128부터 시작하게 되는 것입니다.
unsigned char의 범위는 0 ~ 255 이지만 num2에 저장된 값은 256으로 범위보다 1 많습니다. 때문에 범위를 지나 다시 최솟값부터 시작하여 0의 값이 출력되는 것입니다.
오버플로우 : 범위의 최댓값을 넘어 다시 최솟값부터 시작하는 오류
언더플로우 : 범위의 최솟값을 넘어 다시 최댓값부터 시작하는 오류
시계의 숫자를 생각해본다면 최댓값 12, 최솟값1이 이라고 보고 시침이 12에서 1로 가는것을 오버플로우 반대로 1에서 12로 거꾸로 되돌아가는 것을 언더플로우라고 생각하시면 됩니다.
마지막으로 사용자가 사용하는 값의 크기가 얼마나 되는지 범위에 속하는지 알아보는 방법을 알려드리겠습니다.
#include <stdio.h>
int main()
{
int num1 = 0;
char num2 = 0;
int size1;
int size2;
size1 = sizeof num1;
size2 = sizeof num2;
printf("num1의 크기: %d\n, num2의 크기: %d\n",size1,size2);
return 0;
}
위 코드를 먼저 입력 후 확인하면 같은 0의 값이지만 num1 과 num2의 결과는 다른 결과가 나왔습니다.
이는 자료형의 크기가 다르기 때문입니다. int로 받은 0은 4바이트 그리고 char으로 받은 0은 1바이트가 출력되게 됩니다.
여기서 사용된 sizeof는 자료형 혹은 표현식의 값을 바이트 단위로 구하는 연산자입니다.
때문에 10의 크기와 0의 크기는 같은 int로 받을 경우 결과는 같은 4바이트로 출력되게 됩니다. 즉 자세하게 비트 단위로 출력은 못합니다.
sizeof 표현식 / sizeof (자료형) / sizeof (표현식)
오늘 포스팅은 뭔가 가벼운 글 보다는 정말 지식만 썼다는 느낌이네요. 하지만 이 기본을 알고있어야 나중에 배울 내용에서 사용 할 수 있기때문에 되도록 상세하게 알려드리려고 했습니다.
오늘 포스팅도 읽어주서서 감사합니다.
'프로그래밍 언어 > C(C언어)' 카테고리의 다른 글
[C언어] 변수에 직접 입력하기 (0) | 2018.01.23 |
---|---|
[C언어] 이번에는 소수로 표현해보자 실수 자료형 (0) | 2018.01.16 |
[C언어] 값에도 신분증이 있다? 변수 입력 (0) | 2018.01.10 |
[C언어] 게임버그! 프로그램버그! 버그를 잡자! (0) | 2018.01.08 |
[C언어] hello, world!! 공돌이 개미지옥의 시작이었다. (0) | 2018.01.07 |
- Total
- Today
- Yesterday
- security
- 프로그래머스
- OOP
- Solid
- Spring
- 백준
- 스프링부트
- java
- 스프링
- 자바
- 디자인패턴
- interview
- docker
- springboot
- C언어
- spring-cloud
- JPA
- CS
- Algorithm
- nginx
- 알고리즘
- ajax
- 릿코드
- Matlab
- kakao
- 면접
- 자격증
- 그래프
- 매트랩
- 수학
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |