C언어

추가 개념 정리 / 문제 해결 능력에 관하여

hyuniiie 2021. 8. 27. 19:52

1챕터와 2챕터를 통괄하는 보충 강의 와 문제해결능력에 대한 강의 노트

 

특수문자

  • \n : 다음 줄
  • \t : 탭 문자 (4~8칸 만큼 공백을 만든다 )
  • \" : 따옴표 (큰따옴표를 문자열 안에서 활용)
  • \0 : 널 문자 (0)

 

변수의 타입

byte 수를 대충은 인지하고 있어야 한다.

음수가 양수보다 한개 더 많다 (|최소값| > |최대값|) 0을 포함한 이진수 이기 때문

음수가 있는 변수를 signed 데이터 타입 부호가 있다라는 뜻

부호가 없이 쓰고싶을 땐 앞에 unsigned를 붙여주면 된다 -> 부호 없는 정수

(unsigned는 float나 double에는 쓸 수 없다)

 

long 이라는 데이터 타입은 시스템에 따라서 크기가 달라진다.

32bit에서는 4byte, 64bit에서는 8byte

하지만 long long은 늘 8byte

 

해당 CPU가 가장 빨리 연산 할 수 있는 데이터 크기가 int

 

int

  • 일반적으로 4byte
  • 일반적으로 컴퓨터에서 가장 빠르게 연산할 수 있는 단위
  • int는 시스템마다 크기가 다를 수 있다. 
  • 하지만 현대 컴퓨팅에서는 대부분 4byte가 된다

long

  • 4byte
  • 다른 프로그래밍 언어에서는 8byte
  • C/C++ 에서 8byte를 표현하는것은 long long
  • 64bit 컴퓨터 시스템에서 long은 8byte, long long도 8byte
  • 즉 8byte 정수형을 위해서는 안전하게 long long을 많이 쓴다

unsigned

  • 부호없는 이라는 뜻
  • 일반적으로 unsigned가 선언되지 않으면 부호있는 숫자가 된다

데이터형 예시

  • // 8byte  //long long vLong;
  • // 4byte 0, 양수  //unsigned int uInt;
  • // 부호없는 8byte 0, 양수  //unsigned long long uLong
  • // 아래 코드는 에러  //unsigned float uFloat;

unsigned라는 키워드는 거의 사용하지는 않는다, 그냥 있다 정도만 알면 됨

 

OverFlow

: 변수형에 할당될 수 있는 값의 범위를 벗어난 연산은 Overflow가 일어나게 된다

모든 변수는 자신이 갖고 있는 값 이상을 갖게 되려고 할 때 오버플로우가 일어나며 가장 작은 숫자로 바뀜

 

Char의 최대값

Char (signed value)의 경우 -> 부호가 있는 Char의 최대값 -> 127이 양수로 최대값이 된다

0 1 1 1 1 1 1 1

위에서 +1을 하게 되면 앞에 있는 0이라는 부호가 바뀌게 된다

Char의 최소값 -> 음수의 최소값은 -128 

1 0 0 0 0 0 0 0

 

가장 앞쪽에 있는 부호가 0이면 양수 1이면 음수

변수가 가질 수 있는 값의 최대값의 크기를 벗어나게 되면 overflow 가 발생

 

Char의 최대값 즉 부호있는 1byte 숫자의 최대값인 1111111 에다가 1을 더하게 되면

최소값이 만들어 진다는거, 이걸 overflow라고 함

때문에 프로그래머들은 자기가 사용해야 될 어떤 변수의 크기가 어느정도 될지를 미리 예측하고 있어야 됨

 

Underflow

: 가장 낮은 숫자가 더 낮은 숫자를 가지려 할 때 일어난다. 보통 0에서 -1이 되는 과정

 

0

Char (signed value)의 경우

0 0 0 0 0 0 0 0

-1 을 하기

-1

1 1 1 1 1 1 1 1

0에서 -1이 되는 과정에서 underflow 발생

 

젤 앞은 부호 bit 니까 양수 부호가 0이면 양수

음수의 정수 중에서 가장 큰 수는 -1

 

printf format string

: printf 변환 문자는 format string 이라고 불린다.

이 포맷스트링에는 여러 종류가 있으나 실질적으로 필요할 때 찾아볼 수 있는 수준이면 된다

 

타입 설명
%d 정수형 변환
%c 문자형 변환
%u 부호없는 정수형 변환
%ld long long 변환
%f 소수점수 변환
%s 문자열 변환

 

배열 크기에 관하여

  • 배열 크기에는 변수가 들어갈 수 없다 (배열 인덱스에는 가능하나) 배열을 선언할때 크기를 지정할 때에는 변수를 활용할 수 없다
  • 동적 메모리 할당에서는 가능하다
  • 다른 언어에는 malloc 이라는 동적 메모리 할당을 자동으로 하기 때문에 가능

int size = 10;

int vArray[size];

// size 자리에 변수를 집어넣을 수 없다. 숫자만 가능

 

프로그램 실행과 메모리

  • 변수를 만들게 되면 (램)메모리 상에서 변수에 대한 공간이 할당
  • 이는 배열(Array)도 마찬가지며, 이 변수의 공간에 대한 3요소가 정해지는데 이것이 이름(name), 주소(address), 값(value)다
  • 여기에서 주소는 컴퓨터가 변수를 관리하는 방법이 되는데 배열은 기본적으로 포인터 형태이기 때문에 이 주소의 음수 인덱스에 접근하거나 크기를 벗어나는 접근이 가능