본문 바로가기
Language & Framework & GIT/C

[씨앤씨뿔]C/ 데이터형&연산자

by veganwithbacon 2023. 3. 25.
반응형

컴퓨터 시스템에서는 2진 데이터(binary data)로 표현되며 저장된다,

2진 데이터는 모든 데이터를 0과 1로 표현하며, 변수나 상수 값도 마찬가지다.

CS에서 2진 데이터로 값을 표현, 저장하는 방식을 2진 표현(binary representation)이라고 한다.

 

많이들 들어본 컴파일러는 소스 코드를 컴파일해서 기계어로 번역할 때, 데이터형에 따라 값을 저장하는데 필요한 메모리의 크기와 2진 표현을 결정한다.


C 언어에서 제공되는 3가지 데이터형

1. 기본 데이터형(primitive data type) : char, int, double...

2. 파생 데이터형(derived data type) : 배열, 포인터처럼 기본형으로 파생되는 만들어진 데이터형

3. 사용자 정의형(user-defined data type) : 구조체, 공용체, 열거체처럼 프로그래머가 직접 정의하는 데이터형

기본 데이터형 문자형 char 1byte
정수형 short 2byte
int 4byte
long 4byte
long long 8byte
실수형 float 4byte
double 8byte
long double 12

 

위 표에서 보이는 데이터형이나 값의 바이트 크기를 구하려면 다음과 같이 sizeof 연산자를 이용하면 된다.

ex) sizeof(char) 

      sizeof(int)

      sizeof(num)

      sizeof 3.141592

 

이처럼 소스 코드에서 데이터형이나 값의 크기가 필요할 때는 sizeof 연산자로 구한 크기를 사용하는 것이 좋다.

 

각 데이터형의 정확한 크기는 플랫폼에 의해 결정되며, 

항상 sizeof(short) <= sizeof(int) <=sizeof(long) <= sizeof(long long) 이 성립

 

short int short
signed short
signed short int
unsigned short int unsigned short
signed int int
signed
unsigned unsigned int
long int long
signed long
signed long int
unsigned long int unsigned long

컴퓨터 시스템에서는 음수를 나타내기 위해  2의 보수(2`s compliment)를 사용한다.


-n을 2의 보수로 표현하는 방법 

: 먼저 n을 2진수로 나타낸 다음 각 비트에 대해 0은 1로, 1은 0으로 반전시키고, 결과에 1을 더한다.

 

음수를 2의 보수로 나타내면 부호 비트를 신경 쓰지 않고 덧셈이나 뺄셈을 할 수 있다.

모든 비트를 반전 후, 끝에 1을 더해주자.

 

참.. 배움이라는 게 안 보면 금붕어가 되는 게 순식간인 것 같다.

 

unsigned 형의 데이터형을 고려해, 데이터형이 변수에 저장된 값의 의미를 결정한다는 것을 인지하자.

ex)  1111 1111 1111 0110

       short형 : -10

       unsigned short형 : 65526


정수형으로 사용되는 char형

char형은 문자형이나 1바이트 크기의 정수형으로도 사용가능하며

unsinged char(부호없는 정수형)이나 정수형으로 사용되는 char형으로도 사용될 수 있다.

char형의 경우 -128~127의 범위로 작은 크기의 정수를 저장할 때 유용하다.

 

char형도 정수형으로 덧셈, 뺄셈 연산이 가능하며 변수를 출력할 때는 %d나 %x를 이용한다.

unsigned char은 보통 1바이트 크기의 2진 데이터를 저장할 때 주로 사용

 

정수형이 사용하는 바이트 크기에 따라 표현 가능한 정수의 범위가 달라진다.

예로 char의 유효 범위는 -2⁷ ~(2⁷-1), 즉 -128 ~127이다.

 

unsigned char형은 8비트를 모두 정수 값을 표현하는 데 사용하며,

유효 범위가 0~ (2⁸-1), 즉 0~255이다.

 

정수형 변수에 유효 범위를 벗어나는 값을 저장하면, 정수형의 크기에 맞춰 값의 나머지 부분을 잘라 버리기 때문에, 변수에 항상 유효 범위 내의 값만 저장된다.

최댓값보다 큰 값을 저장할 때 값이 넘쳐흘러서 유효 범위 내의 값으로 설정되는 것을 오버플로우(overflow)

정수형의 최솟값보다 작은 값을 저장할 때도 유효 범위 내의 값으로 설정되는데, 언더플로우(underflow)

 

ASCII 코드는 가장 기본적인 문자 코드로, 출력이 되지 않는 제어 문자(control charater)와 출력 가능한 문자(printable character)로 이뤄진다. 10진수 ASCII 코드 중 0~31과 127이 제어 문자이고, 나머지 32~126이 출력 가능한 문자이다.

ASCII 코드에서 A, a의 크기 차이는 각 65,97로 32가 차이 난다.

 

ex) ASCII 코드   A : 65     a : 91

                          Z : 90     z  : 122

 

특수 문자

특수 문자 의미
'\0\ 널 문자
'\a' 경고음
'\b\' 백스페이스
'\t' 수평탭
'\n' 줄 바꿈
'\v' 수직 탭
'\f' 폼 피드
'\r' 캐리지 리턴
'\"' 큰따옴표
'\'' 작은따옴표
'\\' 역슬래시

실수형

 

컴퓨터 시스템에서는 실수를 2진 데이터로 표현하는데  부동소수점(floating point) 방식을 사용한다.

부동소수점 방식은 실수를 지수 부분과 가수 부분으로 나누어 2진 데이터로 저장한다.

부동 소수점 방식으로 0.3141593 x 10¹, 3.141593 x 10⁰ , 0.03141593 x 10² 이 같은 값이다.

즉, 실수의 정밀도는 실수의 가수 부분에 의해 결정되고, 실수의 범위는 지수 부분에 의해 결정된다.

 

실수의 정밀도는 단정도(single precision)와 배정도 (double precision)로 두 가지가 있다.

float형이 단정도 실수를 나타내고, double형이 배정도 실수를 나타낸다.

4byte크기인 float형은 최상위 1비트를 부호 비트, 다음 8비트를 지수, 나머지 23비트를 가수로 사용한다

8byte크기인 double형은 최상위 1비트를 부호 비트로, 다음 11비트를 지수로, 나머지 52비트를 가수로 사용한다.

 

 

부동 소수점 방식으로 실수 값을 표현 시에, 실수 값에 오차가 생길 수 있는데, 

이는 주어진 비트로 가수를 표현할 수 없을 때 반올림을 통해 표현하기 때문이다.

 

실수 표현에서 발생하는 오차를 줄이려면 double형을 사용하는 것이 좋다

 

실수형을 표현할 때도 오버플로우나 언더플로우가 발생한다.

실수형 변수에 최댓값보다 큰 값을 저장하려고 하면 무한대(INF)로 설정되며, 실수형 변수에 최솟값보다 작은 값을 저장하려고 하면,  가수 부분을 줄이고 지수 부분을 늘려 실수를 표현하거나, 만일 그것이 불가능해지면 0으로 만들면 된다.


 

변수의 선언 : 변수 사용을 위해 먼저 컴파일러에게 데이터형과 변수명을 미리 알려주는 것

변수 선언을 하게 되면 컴파일러는 데이터형에 따라 특정 크기의 메모리를 할당, 그 메모리를 변수 명으로 접근할 수 있게 해 준다.

변수명처럼 프로그래머가 만들어 사용하는 이름식별자

c언어에서 이미 등록된 약속된 단어를, 예약어라고 한다.

식별자를 만들 때는, 의미를 알 수 있도록 충분한 길이의 이름을 사용하는 것이 좋다.

 

선언 시 초기화되지 않은 변수의 값은 쓰레기 값이다.

변수가 메모리에 할당될 때 값을 지정하는 것을 변수의 초기화(initialization)라고 한다.

다들 JAVA를 해봤다면 이와 마찬가지다로 int weideth = 100;과 같이 설정해 주면 된다.

변수를 초기화할 때 변수의 데이터형과 같은 형의 값으로 초기화해야 한다.

데이터형이 일치하지 않으면 데이터형에 맞춰 컴파일러가 처리하는데, 이 과정에서 값이 손실되면 컴파일 경고를 발생시킨다. 초기화되지 않은 변수를 사용하는 것은 위험하기 때문에 0으로라도 초기화하는 것이 안전하다.

 

위의 초기화에서 언급했듯이 변수에 값을 대입할 때는 변수의 데이터형과 같은 형의 값을 대입해야 한다.

 

 

상수는 프로그램에서 값이 변경되지 않는 요소이다.

이처럼 한 번만 사용된 다음 없어지는 것이 임시 값(temporary value)이다.

 

리터럴 상수는 값 자체를 직접 사용하는 것을 의미한다.

문자열 상수에는 문자열의 끝을 나타내는 널 문자('\0')가 함께 저장된다.

 리터럴 상수에 u/U나 l/L, f/F 등의 접미사가 사용되면 의미에 맞는 데이터로 간주된다.

ex) float a= 1.23; 더블형

      float a= 1.23F; 플로형

 

상수는 메모리에 저장하지 않으면 어디에 있을까

상수는 기계어 수준에서 보면 사용하는 동안만 잠깐 CPU 레지스터에 값을 넣어 사용한다.

상수 중에서도 문자열 상수는 메모리에 저장된다.

이와 달리 값을 변경할 수 없는 읽기 전용 메모리(read-only memory) 영역에 저장해서 읽기 전용으로만 사용하기도 한다.


매크로 상수

: #define문으로 정의되는 상수

매크로 명은 다른 이름과 구별가능하나 대문자로 만든다.

#define문은 전처리기가 처리하는 문장이다.

전처리기는 컴파일러가 소스 파일을 컴파일하기 전에 먼저 수행된다. 프로그래머가 작성한 소스 파일을 컴파일할 수 있도록 변환해서 준비한다.

#include문과 #define문은 C문장이 아니다.

 

#define문은 #define으로 정의된 매크로 상수를 특정 값으로 대치(replace)한다.

그러나 문자열 안에 포함된 매크로 상수는 대치할 수 없다.

 

매크로 상수는 변수가 아니므로, 전처리기 수행 후에 매크로 상수의 값은 변경할 수 없다.

그러므로 매크로 상수를 정의한 후에 해당 상수에 값을 대입하려고 하면 컴파일 에러가 발생한다.

 

매크로 상수는 보통 함수 밖에 정의하며, 함수 내에 정의할 경우 해당 함수 안에서만 사용할 수 있다.

 


const 변수

: 값을 변경할 수 없는 변수 

 

const 변수도 일반 변수처럼 메모리에 할당되나, 일반 변수와는 달리 값을 변경할 수 없다.

const 변수는 일반 변수와는 다르게 값을 변경할 수 없는 메모리에 할당되기 때문이다.

 

const 변수는 초기화된 다음에는 값을 변경할 수 없으므로, const 변수는 반드시 선언 시 초기화해야 한다.


기호 상수

: 매크로 상수와 const 변수처럼 이름이 있는 상수

 

기호 상수를 사용하면 프로그램이 이해하기 쉬워지기 때문에 사용한다.

이해하기 쉬운 코드가 좋은 코드이기 때문이다.

반응형

'Language & Framework & GIT > C' 카테고리의 다른 글

[씨앤씨뿔] C/ 함수  (0) 2023.04.04
[씨앤씨뿔] C/ 제어문  (0) 2023.03.28
[씨앤씨뿔] C/ 연산자  (0) 2023.03.27
[씨앤씨뿔]C/ C 구성 요소  (0) 2023.03.23
[씨앤시뿔] C/ C?  (2) 2023.03.23

댓글