Computer Science/C

C언어 3강 | 데이터 타입 | char, int(short, long,unsigned), float, typedef

토마토. 2021. 12. 16. 12:04

Declaration, Expression, Assignment

Declarations 선언

변수 Variables와 상수 constants는 반드시 사용되기 전에 선언되어야 한다. 

선언에서는 [1] 변수와 type을 연결짓고

[2] 컴파일러로 하여금 특정한 양의 메모리를 잡아두도록 한다. 

#include <stdio.h>
int main(void){
    int a, b, c;
    float x, y = 3.3, z = -7.7;
    printf("Input two integers: ");
    scanf("%d%d", &b, &c);
    a = b+c;
    x = y+z;
}

Expressions

함수, 변수, 연산자, 상수 등을 조합하여 만들어진다.

 

assignment statement

variable = expression;

 

기본적인 데이터 타입 Data Types

기능에 따라서 분류해보면, 

정수형 :

[1] char signed char unsigned char

[2] short int long

[3] unsigned short unsigned unsigned long

실수형 : 

float double long double

 

 

Char

char 타입은 작은 정수를 담을 수 있다.

 

1 byte 메모리 영역을 할당받게 됨

char에는 문자, 숫자, 특수문자, 문장기호 등이 포함된다. 

 

ASCII charactor code를 이용하면, 

character constant를 대응하는 정수 값으로 표현할 수 있다. 

(예를 들면, 'a' == 97)

 

프린트하기 어려운 character 같은 경우에는, \ 기호를 이용해서 표현한다.

\(backslash character)는 escape character라고 부르는데, 

\를 이용하면, 본래 의미에서 탈출(escape)해서 새로운 character를 표현할 수 있다.

가장 자주 사용하는 경우는 \n(newline) \0(null character) \"(double quote) \' (single quote)가 있다. 

이외에도

alert : \a (작은 종소리를 들리게 함)

backslash : \\ (\ 출력)

 

character를 integer처럼 취급할 수 있다. char c = 'a';

#include <stdio.h>

int main(void){
    char c = 'a';
    printf("%c", c);
    printf("%d", c);
    printf("%c%c%c", c, c+1, c+2);

    char c;
    int i;
    for (i='a';i<='z';++i){
        printf("%c", i);
    }
    for (c='0';c<='9';++c){
        printf("%d", c);
    }
    return 0;
}

char c = 'a';

는 1byte 메모리에 01100001(97)과 같이 저장된다. 

이때 type char는 1byte이므로 256개의 값을 표현할 수 있는데,

signed char는 부호가 있는 것이므로 -128부터 127까지

unsigned char는 부호가 없는 것이므로 0부터 255까지 표현해낸다. 

Int

'근-본'이 되는 데이터 타입

2 byte나 4byte에 저장된다. (64 bit OS의 경우 4 혹은 8 바이트)

따라서 2^(8*sizeof(int)) 만큼의 값을 표현해낼 수 있다. 

 

Short, Long, Unsigned

type int가 기본이지만, char, short, long도 특수한 목적을 위해 사용될 수 있다. 

short : 2 bytes (메모리 부족한 경우)

long : 4/8 bytes (큰 정수를 취급해야 하는 경우)

바이트 수는 short <= int <= long 의 관계를 가지고 있다. 

 

int와 unsigned는 machine WORD에 저장된다. 

이때 WORD는 데이터 단위로, 기계어 명령이나 연산을 통해 저장된 장치로부터

레지스터에 옮겨놓을 수 있는 데이터 단위를 의미한다. 

 

integer 뒤에 접미사를 붙여서 타입을 특정해줄 수 있다.

37 : default int

37U : unsigned integer

27L : long integer

37UL : unsigned long integer

Floating type

float, double, long double

실수형

double

int

typedef

type과 identifier를 연결지을 수 있다. 

실제 사용법과 유사한 명칭을 지을 수 있다.

typedef char uppercase;
typedef int INCHES, FEET;
typedef unsigned long size_t;

sizeof

sizeof(object) object 에는 int, float, a+b 등등 다양하게 들어갈 수 있다. 함수가 아니라 연산자임 (unsigned)

getchar(), putchar()

해당 매크로는 stdio.h에 포함되어있다. 

getchar() : scanf랑 비슷함

putchar() : printf랑 비슷함

#include <stdio.h>
int main(void){
    int c;
    while((c=getchar())!=EOF){
        putchar(c);
        putchar(c);
    }
    return 0;
}

파일 입출력에서 종종 사용하는 EOF는

End Of File의 약자다. 

파일의 끝을 표기하는데, 

stdio.h 헤더 파일에서는 EOF를

#define EOF (-1)과 같이 정의한다. 

 

(c=getchar())!=EOF 표현은 기억해두자. 

 

#include <stdio.h>
int main(void){
    int c;
    while ((c=getchar())!=EOF){
        if (c>='a'&&c<='z'){
            putchar(c+'A'-'a');
        }
        else
            putchar(c);
    }
    return 0;
}

 

assignment conversions

assignment에서 발생하는 형 변환에 대해 알아보자.

오른쪽이 왼쪽으로 형 변환된다. 

[1] float = double

(반올림되거나 버림 처리됨)

[2] int = float

(float의 소수점 이하를 버림)

[3] long int = short int

(큰 bit 영역을 버림)

usual arithmetic conversions

 

일반적인 산술 변환 | Microsoft Docs

 

일반적인 산술 변환

자세한 정보: 일반적인 산술 변환

docs.microsoft.com

conversions and casts

[1] widening

 

[2] Narrowing : loss of information

 

사례 1. (char) - (short) / (int) = int

사례 2. (unsigned) * (float) - (int) = double

사례 3. char + int = int

사례 4. char + double = double

사례 5. double + short = double

사례 6. int * int / long = long

사례 7. unsigned * int - int = unsigned

사례 8. float * 7 - int = float

사례 9. int * signed * unsigned long = unsigned long

사례 10. long double + char = long double

사례 11. unsigned - unsigned long = unsigned long

사례 12. unsigned - long = system-dependent

 

캐스트 casts

명시적으로 형 변환을 해준다 (int) identifier

cast 연산자는 단항 연산자이다(unary operator)

 

Hexadecimal and octal constants

Octal constants

앞에 0을 붙인다?

%o

Hexadecimal Constants

앞에 0x를 붙인다? 

%x

 

#include <stdlib.h>//표준 라이브러리 헤더 파일
#include <stdio.h> //표준 입출력 헤더 파일
 
int main()//프로그램 진입점
{   
    //16진수 0x12345678
    //0001 0010 0011 0100 0101 0110 0111 1000
 
    //10진수 출력
    printf("%d\n", 10);
    printf("%d\n", 010);//8진수 10(8진수) = 8+0 = 8
    printf("%d\n", 0x10);//16진수 10(16진수)16+0 = 16
 
    //8진수 출력
    printf("%#o\n", 10);//8+2 =>12(8진수)
    printf("%#o\n", 010);//10
    printf("%#o\n", 0x10);//16진수 10(16진수)16+0 = 16 =>20(8진수)
 
 
    //16진수 출력
    printf("%#x\n", 10); //a
    printf("%#x\n", 010);//8 
    printf("%#x\n", 0x10);//10
    system("pause");
    return 0;
}