1. C언어의 상수와 변수

 

상수(Constant)는 프로그램을 실행할 때 한번 값이 결정되면 프로그램이 끝날 때 까지 다른 값으로 바뀌지 않는 정보이다.
보통 상수는 숫자형, 문자형, 문자열형으로 구분할 수 있음

 

숫자형 상수

숫자형 상수(Numeric Constant)는 프로그램에서 가장 기본적인 형태의 상수이며 정수형 상수(Integer Constant)실수형 상수(Floating-point constant)로 나뉜다.

정수형 상수 -> -5, 0, 1, 2
실수형 상수 -> -5.1, 0.17, 225.1892

 

C언어 프로그램에서 숫자형 상수는 다음과 같이 쓰인다.

unsigned int num = 4500; /* 정수형 상수 4500을 부호가 없는 int 자료형 num 변수에 저장함 */
float a = 0.17 /* 실수형 상수 0.17을 float 자료형 a 변수에 저장함 */

 

정수형 상수의 다양한 진법 표현

정수형 상수는 10진수 형식 뿐만 아니라 8진수나 16진수 형식으로도 표현할 수 있다.

8진수 -> 012, 050, 075
16진수 -> 0x25, 0x51, 0xFC, 0xD5, 0xaf, 0xal

8진수 형식의 숫자를 사용할 때 주의해야 할 점은 8진수는 각 자리마다 0~7의 숫자로 구성돼야 하는데 실수로 091, 082와 같이 8진수로 표현할 수 없는 형식의 숫자를 사용하면 오류가 발생한다.

error C2041 : illegal digit '9' for base '8' -> 091의 경우 발생하는 오류 메시지
error C2041 : illegal digit '8' for base '8' -> 082의 경우 발생하는 오류 메시지

 

 

문자형, 문자열형 상수

프로그램에서 문자를 표시할 때 사용하는 문자형 상수(Character Constant)는 작은따옴표(')를 사용하여 영문자, 숫자형 문자, 특수 문자로 구분된다.

'A', 'd', 'F', '2', '5', '7', '*', '-', '+' ...
chat key = 'A'; /* A의 아스키 값 65를 변수 key에 저장함 */
char next = 'A' + 1; /* A의 아스키 값에 1을 더한 66(B의 아스키 값)을 변수 next에 저장함

 
문자열형 상수(Character-string Constant)는 프로그램에서 문자열을 표시할 때 사용하며 " "로 묶어서 표현한다.

"Hello!", "리그 오브 레전드", "나는 황족 원딜러"

 




변수(Variable)는 변하는 값이며, 프로그래밍에서는 두 가지 의미를 가진다.
1. 프로그램이 실행되는 동안 지속적으로 값이 바뀌는 정보
2. 사용자로부터 데이터를 받거나 처리할 때의 저장공간

 

변수 이름

변수 이름은 데이터가 저장되는 공간(메모리)을 가리키는 별명이다.

int n; /* 4바이트 메모리 공간을 주소 대신 n이라는 변수 이름으로 사용함 */

메모리는 1바이트 단위로 부여된 주소로 구분되기 때문에 자신에게 할당된 메모리 공간을 사용하려면 해당 메모리의 시작 주소를 기억해야 한다.
프로그래머가 숫자로 구성된 주소를 일일히 기억하기는 어렵기 때문에 해당 주소에 이름을 붙여서 사용한다.

 

변수 이름을 정할 때 기억해야 할 것

변수 이름은 모두 숫자로 구성하거나 숫자로 시작하는 문자열은 변수 이름으로 사용할 수 없다.

name, test, _test, Date, Time_to, Data_7, ... <- 올바른 사용(O)
1000, 7_data, ... <- 잘못된 사용(O)

name 1(x), first data(x) <- 공백 포함할 수 없음
char, int, ... (x) <- C언어의 예약어는 변수 이름으로 사용할 수 없음

 

변수 선언

변수를 선언하는 것은 저장 공간을 할당하는 것이다.
signed int num;

변수를 선언하면서 초깃값을 대입하는 것을 '초기화'라고 한다.
int value = 0;
4바이트 크기의 value 변수에 정수형 상수 값 0을 넣어서 초기화함


표기법

카멜 표기법 -> myName
스네이크(헝가리안) 표기법 -> my_name

 


퀴즈

💡 "변수를 잘못 선언한 형식 찾기"
1. short signed_number;
2. int char = 5;
3. double real num = 2.3;
4. long 77_value;
5. char data = a;

 

  1. O
  2. 키워드는 변수 이름으로 사용 불가능
  3. 변수 이름엔 공백이 없어야함
  4. 변수 이름은 숫자로 시작할 수 없음
  5. 문자 a를 초깃값으로 사용하고 싶으면, 'a' 또는 97이라고 적어야 함

 




2. C언어의 자료형

 

자료형은 데이터를 표현하는 기준, 메모리를 사용하는 단위이다.

컴퓨터 메모리가 1바이트 단위로 주소가 부여돼 있다고 해서 데이터를 저장하거나 읽을 때 1바이트 단위로만 사용해야 하는것은 아니다.
자신이 사용할 데이터의 크기에 맞게 메모리(저장 공간)을 할당해서 사용하면 되는데, 메모리를 사용할 때 몇 바이트의 메모리를 사용할것인지 명시하는 것을 자료형(Data Type)이라고 한다.

 

정수를 표현하는 자료형

signed char : 부호가 있는 1바이트 저장 공간

signed char temperature;
temperature = -2; /*영하 2도씨를 temperature 변수에 저장함 */

부호 비트가 0이면 양수를 의미하고 총 128(0~127)개의 숫자 중 하나를 저장할 수 있다.
부호 비트가 1이면 음수를 의미하고 128개의 숫자(-128~-1)중 하나를 저장할 수 있다.
따라서 signed char 자료형은 -128~127의 숫자 중 하나를 저장할 수 있는 크기이다.

unsigned char : 부호가 없는 1바이트 저장 공간

unsigned char age;
age = 52;

부호 비트 없이 1바이트(8비트) 전체를 숫자 저장 공간으로 사용하기 때문에 0~255 중 하나를 저장할 수 있는 크기이다.

signed short int : 부호가 있는 2바이트 저장 공간

signed short int dday;
dday = -20; /* D-Day가 20일 남았다고 dday라는 변수에 저장함 */

2바이트(16비트) 크기의 자료형.
부호 있는 데이터를 처리하기 때문에 첫 1비트는 부호 비트로 사용하고 나머지 15비트에만 숫자를 저장한다.
부호 비트가 0이면 양수를 의미하고 2^15인 32,768개의 숫자(0~32,767)중 하나를 저장할 수 있다.
부호 비트가 1이면 음수를 의미하고 32,768개의 숫자(-32,768~-1)중 하나를 저장 할 수 있음.

unsigned short int : 부호가 없는 2바이트 저장 공간

unsigned short int seconds;
seconds = 35000;

예로 10시간 이내의 값을 초 단위로 저장해야 한다면 signed short int 자료형의 양수 영역을 벗어난다. 부호가 없는 unsigned short int는 2바이트 전체를 숫자 저장 공간으로 사용하기 때문에 65,536개의 숫자(0~65,535)중 하나를 저장할 수 있음.

 

signed long int : 부호가 있는 4바이트 저장 공간

signed long int money;
money = 7000000;

부호 비트가 0이면 0~2,147,483,647
부호 비트가 1이면 -2,147,483,648~-1

 

unsigned long int : 부호가 없는 4바이트 저장 공간

unsigned long int time_seconds;
time_seconds = 1453100624;

4바이트 전체를 숫자 저장 공간으로 사용하기 때문에 2^32인 0~4,294,967,295

 

실수를 표현하는 자료형

float : 32비트 부동소수점 표현

float pi;
pi = 3.14;

32비트 기반인 float는 저장 범위는 int와 같지만 정수부와 소수부를 모두 저장해야 하기 때문에 소수점 이하 숫자가 6자리밖에 안된다.

 
그 범위를 넘어가서

float pi;
pi = 3.141592654;

출력값 : 3.141592'741'

이렇게 소수점 이하에 6개보다 많은 숫자를 쓰고 pi 변수에 저장한 후 출력해 보면, 다음과 같이 6자리를 넘는 숫자부터 잘못된 값을 출력한다.
소수점 이하 숫자를 6자리 이상 사용하려면 64비트 기반의 double 자료형을 사용해야 한다.

 

double : 64비트 부동소수점 표현

64비트를 기반으로 하기 때문에 소수점 이하 14자리까지 안전하게 저장 가능

double pi;
pi = 3.141592654;

출력값 : 3.14159265400000

 




3. 오버플로우와 언더플로우

메모리 공간을 1바이트 사용하여 변수를 할당하면 2^8, 256개의 표현이 가능하다.
할당된 변수의 메모리공간을 초과하는 데이터를 입력했을때 생기는 현상을 오버플로우, 언더플로우 라고 한다.

 

오버플로우 (OverFlow)

변수가 표현할 수 있는 최대의 범위를 넘어가는 경우.

자료형 char의 경우 -128~127의 범위를 가지고 있는데, char형 자료형을 가진 변수에 127 이상의 값이 들어가려고 하면 오버플로우 현상이 생긴다.


char형 자료형일 때, 1개의 부호비트와 7개의 데이터의 영역을 가지고 있어서 양수 127까지 표현을 할 수 있는 것이다.
127을 메모리상의 이진수 형태로 보면 0111 1111이 되는데, 여기서 +1을 하면 7bit 영역이 아닌 부호비트가 바뀌며 1000 0000이 되어버린다. 원했던 128이 아니라 -128이 출력된다.
이런식으로 사용자가 선택한 자료형의 메모리 공간의 표현을 넘어가는 경우를 오버플로우라고 한다.

 

언더플로우(UnderFlow)

변수가 표현할 수 있는 최소 값의 표현을 넘어가는 경우.


-128의 이진수 형태인 1000 0000에서 -1을 하면 부호 비트가 바뀌어 0111 1111이 되어버린다. 원했던 -129가 아니라 127이 출력되어버린다.

 


+) 이해해보기

#include <stdio.h>
#define PI 3.14

int main(){
	int numOne = 1;
	int num_two = numOne; //두 변수의 명명규칙에는 어떤 차이가 있는가?
	float pi = PI;
	double int = 2.172; //가능한 코드인가?
	
	unsigned int big1 = 2147483649;
	int big2 = 2147483649;
	printf("%d %d\n", big1, big2); //어떤 결과가 출력되는가? 왜 이런 값이 출력되는가?

	long long int realbig = 9223372036854775807;
	printf("%lld\n", realbig);
}
  • num0ne은 카멜 표기법을 따르고 num_two는 스네이크 표기법을 따른다.
  • 변수의 이름으로 예약어인 int를 사용했기 때문에 가능한 코드가 아니다.
  • -2147483647 -2147483647 이라고 출력되었으며, big1과 big2는 모두 32비트 정수형 변수이다. 변수의 범위를 초과하여 unsigned int인 big1에는 범위를 넘어서는 값인 '2147483649'가 저장된다. 부호 있는 정수 int인 big2에도 동일한 값이 저장된다.
    그러나 %d 포맷 지정자를 사용해서 printf에서 출력하면 이 값은 부호 있는 정수로 해석되므로 오버플로우로 인해 예측할 수 없는 결과가 나타난다.
    만약 부호 없는 정수로 출력하려면 '%u'를 사용할 수 있다.
    printf("%u %u\n", big1, big2);
  • 9223372036854775807 그대로 출력.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN