상세 컨텐츠

본문 제목

C언어를 배워보자 - 자료형의 이해

본문

자료형이 무엇입니까?

 

자료형은 데이터를 표현하는 기준입니다. 때문에 변수도 상수도 자료형에 근거합니다

 

아! 제가 정수를 저장할건데요 크기는 4바이트로 하려고 합니다. 그 정도면 충분할거에요. 그리고 변수의 이름은 num으로 할게요

int num;

 

이렇게 다양한 자료형이 존재하는 이유는 다음과 같다

 

첫째 데이터의 표현방식이 다르기때문에

실수와 정수의 표현방식이 다르다 따라서 다른걸 써줘야된다

 

둘째 메모리 공간의 적절한 사용을 위해서

그렇게 큰 수도 아닌데 큰 메모리 공간을 쓸 필요는 없으므로

최적화를 위해 값의 크기에따라 적절한 메모리 공간을 할당한다

 

 

sizeof 연산자(함수아님) 이용하여 자료형별 바이트 크기 확인하기

#include <stdio.h>
 
int main(void)
{
    char ch=9;
    int inum=1052;
    double dnum=3.1415;
    printf("변수 ch의 크기: %d \n", sizeof(ch));
    printf("변수 inum의 크기: %d \n", sizeof(inum));
    printf("변수 dnum의 크기: %d \n", sizeof(dnum));
    
    printf("char의 크기: %d \n", sizeof(char));
    printf("int의 크기: %d \n", sizeof(int));
    printf("long의 크기: %d \n", sizeof(long));
    printf("long long의 크기: %d \n", sizeof(long long));
    printf("float의 크기: %d \n", sizeof(float));
    printf("double의 크기: %d \n", sizeof(double));
    return 0;
}

책에서는 long이 int와 같은 4바이트를 차지하였지만

내가 코드를 실행해보았을때는 long이 8바이트로 나왔다 이건 플랫폼차이?이려나 아니면 c의 버전 차이때문일까

저자는 vc++를 사용한다고 하고 나는 vsc를 사용중이긴하다

 

char, short, int, float정도만 많이 쓸것같다

 

정수를 표현 및 처리하기 위한 일반적인 자료형의 선택

책에서 내가 자료형 개념을 접한후 갖게된생각과 똑같은 질문을 던졌다

저장하고자 하는값이 -32768 이상 +32767이하라면 short형 변수를 선언하는게 효율적인가?

문장을 읽고 어 아니에요? 소리가 나온다

 

상황에 따라 다르다고 한다

 

즉 값의 범위만 가지고 short냐 int냐를 결정할수 없다고 한다

#include <stdio.h>
 
int main(void)
{
    char num1=1, num2=2, result1=0;
    short num3=300, num4=400, result2=0;

    printf("size of num1 & num2: %d, %d \n", sizeof(num1), sizeof(num2));
    printf("size of num3 & num4: %d, %d \n", sizeof(num3), sizeof(num4));
    
    printf("size of char add: %d \n", sizeof(num1+num2));
    printf("size of short add: %d \n", sizeof(num3+num4));

    result1=num1+num2;
    result2=num3+num4;
    printf("size of result1 & result2: %d, %d \n", sizeof(result1), sizeof(result2));
    return 0;
}

주목할점은 

num1+num2의 바이트수는 4

 

num1과 num2를 더해서 만든 result의 바이트수는 1이라는점이다

 

그럴만한 이유가 있다고 하는데..

 

 

일반적으로 cpu가 처리하기에 가장 적합한 크기의 정수 자료형을 int로 정의한다.
따라서 int형 연산의 속도가 다른 자료형의 연산속도에 비해서 동일하거나 더 빠르다

 

int형 연산이 cpu 성능을 내기에 가장 좋은 연산이다 보니 int보다 작은크기의 데이터는 int형 데이터로 바꿔서 연산이 진행된다

연산의 횟수가 빈번한 경우에는 저장되는 값의 크기가 작더라도 int형 변수를 선언하는것이 좋다

 

그렇다면 char형 변수와 short형 변수는 불필요한가?

 

데이터의 양이 많아서 연산속도보다 데이터의 크기를 줄이는껏이 더 중요한 데이터들 같은 경우에는 char형, 그리고 short형 변수가 유용하게 사용된다

 

mp3와 같은 음성데이터나 영상데이터의 경우가 크기에 민감한 대표적인 데이터들이다

 

(너무 책의 내용을 다 옮겨오는것같지만 다 중요한 내용이라 어쩔수없는것같다)

 

실수를 표현 및 처리하기 위한 일반적인 자료형의 선택

정밀도는 오차가 발생하지 않는 소수점 이하의 자리수를 뜻한다

오차는 분명히 존재하지만 데이터 표현에 사용되는 바이트수가 커지면 줄어든다

 

정수 자료형에서는 int를 보편적으로 선택하듯이, 실수 자료형에서도 보편적으로 선택하는 자료형이 있나요?

 

라고 물어본다면 책에서는

 

double형을 추천하고있다

 

코드 따라치기(원의 넓이 구하기)

#include <stdio.h>
 
int main(void)
{
    double rad;
    double area;
    printf("원의 반지름 입력: ");
    scanf("%lf", &rad);

    area = rad*rad*3.1415;
    printf("원의 넓이: %f \n", area);
    return 0;
}

 

scanf를 사용해서 변수를 저장할때

변수를 선언 할때 자료형에 맞게 받야한다

 

어차피 자료형 똑같은거 두번쓰는거라면 그냥 한번만 쓰게 하면 안되나? 라는 생각이 들었다

 

double형 변수에 값을 입력받을때는 &lf(long float의 약자이다)

float형 변수에 값을 입력받을때는 &f 로 입력받는다

 

그렇게 하지않으니 이상한 값 0.000000같은게 출력되었다

 

double로 선언된변수를

출력할때는

%f 와 %lf 모두 가능한것을 확인하였다

 

웃긴것은 %lf 로 출력하나 %f로 출력하나

무조건 소수점 6자리까지만 나왔다

실제 계산된값은 소수점 9자리까지였다 

따라서 그냥 소수출력하고 싶으면 %f 쓰면 될것같다 한글자 쓰는게 더 귀찮으니 말이다

 

 

https://patiencelee.tistory.com/650

 

[C언어] %f와 ,%lf의 차이점은??

scanf() 함수로 입력을 받고, printf() 함수로 출력을 하다보면, 종종 실수값을 출력하기 위해, %f와 %lf를 쓰곤합니다. 그런데, 매번 이 둘 중 무엇을 써야 되는가? 고민하게 되는 상황이 발생하여 정

patiencelee.tistory.com

그외에 의문점이 아직 많이 남아있지만 일단 이정도로 알고 넘겼다

관련글 더보기