본문 바로가기
프로그래밍/C

5. C언어 (데이터)

by Choraengyi 2017. 1. 14.
728x90

 C언어의 데이터를 알아보겠습니다. 


문자형은 char 로 선언되게 되는데 이 문자도 바이너리 데이터를 사용합니다. 문자가 숫자에 매칭되있다는 뜻입니다. 여러 코드들이 있지만 대부분 사용되는 ASCII 코드를 예를 들겠습니다.


아래 URL은 ASCII 코드가 상세히 나와있습니다.


https://ko.wikipedia.org/wiki/%EB%AF%B8%EA%B5%AD%EC%A0%95%EB%B3%B4%EA%B5%90%ED%99%98%ED%91%9C%EC%A4%80%EB%B6%80%ED%98%B8


 이러한 ASCII 코드값을 문자를 정수형으로 출력하면 알아낼 수 있습니다.



 다음은 정수형에서 signed와 unsigned 정수를 짚고 넘어가겠습니다. signed는 그냥 평소에 쓰는 음수, 0, 양수가 있는 생략하여서 보통 쓰는 정수형이고, unsigned 같은경우 음수가 없이 양수만 존재하게 됩니다. 


음수를 표현하기 위하여 조건은 최상위 비트가 0이면 양수, 1이면 음수가 되는데 컴퓨터는 이를 이진수로 보수 방식을 취하게 됩니다. 2의 보수를 예를 들면, 8은 0000000000001000 으로 표현됩니다. 그러면 -8은 0과 1을 반전시키고 1을 더해주면 됩니다. 즉 1111111111110111 + 1 하게 되어 1111111111111000 이 됩니다. 


이러한 수를 signed 에서 읽으면 -8이 되나, unsigned 에서 읽으면 최상위 비트도 데이터 저장공간으로 쓰기 때문에 65528의 값이 나오게 됩니다.



 short 의 경우 표현 범위가 -32768~32767 이 되는데, unsigned를 하게 되면 0~65535 가 되는 것입니다. 음수가 없어지고 그만큼 양수가 생긴다고 보면될 거같습니다.


정수형의 범위를 알 수 있는 헤더가 있습니다.


https://ko.wikipedia.org/wiki/Limits.h


 코딩으로 나타내 보겠습니다.



 위와 같이 limits.h 에 매크로 상수로 된 값을 불러와서 사용할 수 있습니다. 버퍼오버플로 검사할때 유용하게 사용할 수 있을거 같습니다.

'

실수의 경우 부호, 지수, 가수로 표현되어서 가수*2^(지수)*부호 를 하여 표현할 수 있습니다. 


float형의 경우 다음과 같이 비트를 가지게 됩니다.


 1

 8

 23

부호   지수           가수

double형의 경우는 다음과 같은 비트를 가지게 됩니다.


1

 11

 52

부호    지수                             가수


 그리고 실수의 경우, 범위의 최대값을 넘어서면 INF 메세지를 출력하게 되고, 최소값을 넘어서 작으면 0이 되어 버리게 됩니다.



위 그림과 같이 3.4e38(=3.4*10^38) 을 초과하게 되면 INF 메세지가 발생하게 되고, 1.18e-38(1.18*10^(-38))보다 작아지면 0으로 되어 버려 출력됩니다.


다음으로 sizeof 함수로 변수의 크기를 구하거나 자료형의 크기를 구한다고 보면 될거 같습니다.



위와 같이 변수나 자료형의 바이트 크기를 구하는데 쓰이는 함수입니다.


연산자로 넘어가 보겠습니다. 연산자는 딱히 어려운 내용이 없어서, %가 나누고 나머지를 구한다는 것과 몇가지 더 알아보겠습니다.


 조건 연산자의 경우에는 3개의 피연산자를 가지게 되는데, 1피연산자가 참이면 2피연산자를 실행, 거짓이면 3피연산자를 실행하게 됩니다. 사용법은


num = a>b ? a*b : a+b


 이런식으로 a가 b보다 크면 a*b를 실행하고, b가 더 크면 a+b를 실행하게 됩니다.



 다음은 형변환에 대해서 알아보겠습니다. CPU는 연산을 할때 정수의 경우 int로 계산하게 되고, 실수의 경우 double로 계산하게 됩니다. 만약, 두개의 short형 변수를 연산할때 연산시에 int로 되어 연산하게 됩니다. 곧 short*short는 int*int로 바뀌어 연산하게 됩니다. 또한 이과정에서 short=short*short 를 하고 싶은데 두 수를 곱한 값이 short의 범위를 넘기게 되면, 오버플로우가 발생하게 됩니다.


실수의 경우에도 double형으로 연산하기 때문에 float끼리 계산하고자 하면, double형으로 변환되어 연산을 하게 됩니다.


 연산시 형변환에 대해 간단히 알아보았고 수를 대입할 때도 비슷한 현상이 발생하게 됩니다.


int a;

a=1.234;


를 한다고 하였을때 a의 값을 출력하게 되면 a는 정수형 변수이기 때문에 1로 출력이 될것입니다. 1.834 등 반올림하면 2가 되는 수도 내림으로 1로 출력이 됩니다.  또한,


float a;

a=5;


를 하게 되면, 5.000000 과 같은 형식으로 출력이 될것입니다. 이 처럼 값을 대입할때도 선언된 자료형에 따라 자동으로 형변환이 일어나게 됩니다.


다음은, 직접 변환시키는 법으로서, 다음과 같이 적을 수 있습니다. 


int a=4;

int b=7;

float c;

c=a/b;

c=(float)a/b;


 위에 보면 a/b를 그냥 c에 넣어주게 되면, int형으로 들어가게 됩니다. 그러나 아래줄에 (float)을 해주게 되면 a에 float으로 형변환이 되어 float형으로 결과가 들어가게 됩니다. 이러한 방식으로 원하는 데이터형으로 임시적으로 변환하여 사용할 수 있습니다.






728x90
반응형

'프로그래밍 > C' 카테고리의 다른 글

7. C언어(배열_1)  (0) 2017.01.26
6. C언어 (사용자 정의 함수)  (0) 2017.01.19
4. C언어 (문자/문자열 입출력)  (0) 2017.01.13
3. C언어 (상수)  (0) 2017.01.11
2. C언어 (변수)  (0) 2017.01.10

댓글