티스토리 뷰

이전 글: C 프로그래밍 요약 노트에서 계속



프로그래의 기본 구성

int main(void)
{
  return 0; // 정상 종료 코드 0
}



변수와 연산자

'값을 저장할 수 있는 메모리 공간에 붙은 이름, 혹은 메모리 공간 자체를 가리켜 변수라 한다.'


int num;
     int : 정수의 저장이 가능한 메모리 공간을 할당
     num : 그리고 메모리 공간의 이름을 num이라 한다.

"변수를 선언만 하고 초기화하지 않으면 쓰레기 값지 저장된다."


#include <stdio.h>
int main(void)
{
  int num1;
  num1=0;
  int num2; // 컴파일 에러가 발생할 수 있다. 가능하면 선언은 가장 앞쪽에 둔다.
  num2 =0; 
}



기본 자료형

int, float 등 자료형을 나눈 것은,
정수냐, 실수냐에 따라 값이 메모리 공간에 저장 및 참조되는 방식이 다르기 때문.


<, >, ==, !=, <=, >= 등의 관계 연산자는,
조건을 만족하면 1, 만족하지 않으면 0을 리턴한다.


C 언어는 0이 아닌 모든 값을 true로 간주한다.


scanf("%d", &num); // 키보드로 입려된 정수를 변수 num에 저장한다.


C언어의 표준 키워드.
auto _Bool break case char _Complex const continue default do double else
enum extern float for goto if _Imaginary return restrict short signed sizeof static
struct switch typedef union unsigned void volatile while


'비트': 컴퓨터가 표현하는 데이터의 최소 단위. 2진수 값 하나를 저장
'바이트': 8비트

1 : 1비트
10000000 : 1바이트

10000000 = 128
11111111 = 255

n개의 bit로 표현하는 데이터 수 = 2의 n제곱


int num1 = 10; // 10진수
int num2 = 0xA; // 0x로 시작하면 16진수
int num3 = 012; // 0으로 시작하면 8진수

(내부적으로는 모두 2진수 형태로 값을 저장)


C언어는 보통 하나의 정수를 4바이트로 표현.
정수의 가장 왼쪽에 존재하는 비트는 '부호비트'
이 비트를 MSB라 하며 Most Significan Bit의 약자로 가장 중요한 비트를 뜻한다.
양수라면 0, 음수라면 1.

음의 정수를 표현할 때에는 2의 보수를 취한다.
( ~num + 1)



실수 표현을 위해 정의된 수식
                 e-127
+-(1.m)x2

표현할 수 있는 범위가 크지만 오차가 있다. --> 부동 소수점 오차


e표기법
0.0001
= 1.0 x 10^-4 (10의 -4승)
= 1.0e-4

1240
= 1.24 x 10^3
= 1.24e+3


비트 연산자
& : 두 개 비트가 모두 1일 때 1
| : 둘 중 하나가 1이라면 1
^ : 서로 다른 경우 1
~ : 반전
<< : 왼쪽 시프트, 정수의 값은 두 배가 된다.
>> : 오른쪽 시프트, 정수의 값은 2로 나누어진다.



자료형(data type)은 데이터를 표현하는 기준. 변수도 상수도 자료형에 근거한다.

자료형 별 크기는 컴파일러마다 차이를 보인다.

자료형은 왜 다른가?
- 데이터의 표현 방식이 다르므로 (예: 정수와 실수)
- 메모리 공간의 적절한 사용을 위해

sizeof(num) sizeof(int) 연산자를 사용해 자료형의 크기 확인 가능

"int 형 연산이 CPU가 성능을 내기에 가장 좋은 연산이다.
따라서 int보다 작은 크기의 데이터는 int형 데이터로 형변환 되어 계산된다."



실수를 표현하기 위한 자료형의 선택에 있어서 가장 중요한 요소는 "정밀도"이다.
정밀도 = '오차가 발생하지 않는 소수점 이하의 자릿수'

실수 자료형 | 소수점 이하 정밀도 | 바이트 수
float | 6자리 | 4
double | 15자리 | 8
long double | 18 | 12

"가장 보편적인 실수 자료형은?" ---> double

double형 데이터는, 입력받을 때는 %lf, 출력할 때는 %f를 사용한다.



unsigned int = 0과 양의 정수만 표현
- 정수 자료형 앞에만 붙일 수 있다.
- MSB도 데이터 크기를 표현하는데 사용
- 표현할 수 있는 범위도 2배



문자의 표현을 위한 약속! 아스키 코드!
"문자 A는 숫자 65, 문자 B는 숫자 66"
C언어는 '미국 표준 협회(ANSI: American National Stadards Institute')에 의해 제정된
'아스키(ASCII: American Standard Code for Information Interchange) 코드'를 표준으로 선택해 문자를 표현.

char c = 'A';
printf("%c %d", c, c); //--> A 65

아스키코드는 0이상 127이하.
char는 1바이트이니까.
(실제로 char형은 정수형이다. 정수가 저장되므로)


상수
int n = 3 + 5 // 3과 5는 각각 상수
할당된 메모리 공간에 이름이 없다.
'리터럴 상수' 또는 '리터럴'

리터럴 상수의 자료형.
"어떠한 자료형으로 저장을 해야 하나?"
메모리상에 저장되는 모든 데이터는 자료형이 결정되어야 한다.

기본!
--> int 형으로 표현 가능한 정수형 상수는 int형으로 저장.
--> double형으로 표현 가능한 실수형 상수는 double 형으로 저장.

float n = 5.789f; // float형은 f를 붙여야 한다.


자료형에 대한 접미사
unsigned int n = 1025U;
long n  =2476L;
unsigned long n = 345UL;
long long n = 577LL;
unsigned long long = 5556ULL;

float f = 3.15F;
long double f = 5.789L;


이름을 지니는 상수 = 심볼릭 상수
const int MAX = 100; // 변경 불가하다.



자료형의 변환.
데이터 크기가 큰 자료형을 작은 자료형으로 형 변환하는 경우,
데이터 손실 뿐 아니라 부호가 바뀌는 경우도 있으니 주의한다.

double num1 = 5.15 + 19;
정수와 실수는 표현방식이 다르므로 사실 상 덧셈이 불가하다.
CPU는 같은 자료형의 두 피연산자를 대상으로만 연산이 가능하도록 설계되어 있기 때문이다.
피연산자의 자료형이 일치하지 않아서 발생하는 자동 형 변환은 데이터의 손실을 최소화하는 방향으로 진행된다.
int -> long -> long long -> float -> double -> long double


기준은 '데이터 손실의 최소화!'
형 변환의 우선순위는 정수 자료형보다 실수 자료형이 무조건 앞서는 형태로 정의

  int a = 3, b = 4;
  double r1 = a / b;
  double r2 = (double)a / b;

  printf("%f\n", r1);
  printf("%f\n", r2);




다음 글: 2. 함수와 변수

반응형
댓글
공지사항