C++ 변수 타입 알아내는 방법

안녕하세요

C의 첫 글은 아무래도 data type 부터 시작해야 되지 않을까 해서 data type에 대해 설명하는 글을 작성하게 되었습니다.

간단한 예제를 보여드리겠습니다.

#include <stdio.h>
//정수형 데이터 타입
char i_c;
short i_s;
int i_i;
long i_l;
long long i_ll;
//실수형 데이터 타입
float f_f;
double f_d;
long double f_ld;
//unsigned 데이터 타입
unsigned char u_c;
unsigned short u_s;
unsigned int u_i;
unsigned long u_l;
// sizeof를 이용해 크기 확인
int main()
{
//정수형 데이터 타입들의 크기
printf("char의 크기는 = %d\n", sizeof(i_c));
printf("short의 크기는 = %d\n", sizeof(i_s));
printf("int의 크기는 = %d\n", sizeof(i_i));
printf("long의 크기는 = %d\n", sizeof(i_l));
printf("long long의 크기는 = %d\n", sizeof(i_ll));
//실수형 데이터 타입들의 크기
printf("float의 크기는 = %d\n", sizeof(f_f));
printf("double의 크기는 = %d\n", sizeof(f_d));
printf("long double의 크기는 = %d\n", sizeof(f_ld));
//unsigned 데이터 타입들의 크기
printf("unsigned char의 크기는 = %d\n", sizeof(u_c));
printf("unsigned short의 크기는 = %d\n", sizeof(u_s));
printf("unsigned int의 크기는 = %d\n", sizeof(u_i));
printf("unsigned long의 크기는 = %d\n", sizeof(u_l));
}

여기서 a,b는 숫자를 저장할 변수로 지정하였습니다.

이렇게 a ,b를 숫자가 들어갈 수 있는 변수라는 것을 선언하기 위하여 앞에 int를 쓰게 됩니다.

이러한 int를 data type이라고 하며

보시면 정수형, 실수형, unsigned로 나누어 작성하였습니다.

각각의 데이터 타입들은 각자 정의된 데이터 크기가 있으며 이를 통해 값의 범위 또한 달라집니다.

다음은 예제에 대한 소스를 컴파일하여 크기를 출력한 화면 입니다.

C++ 변수 타입 알아내는 방법

보시면 char는 1byte, short은 2byte를 나타내고 있습니다. 알아 두셔야 할 것은 이 데이터 값의 크기 중 long과  long double은 32bit와 64bit에서 차이가 나는 값입니다.

32bit와 64bit에서의 데이터 값을 표로 정리해보았습니다.

정수형 데이터 타입

 데이터 타입명 

 데이터 크기 

 값의 범위 

 char

 1 byte

 -128~127

 short

 2 byte

 -32,768~32,767 

 int

 4 byte

 -2,147,483,648~2,147,483,647

 long

 4 byte

 -2,147,483,648~2,147,483,647

 long long

 8 byte

 -2^63 ~ 2^63 - 1

실수형 데이터 타입

 데이터 타입명

 데이터 크기 

 값의 범위

 float

 4 byte

 1.175494E-38 ~ 3.402823E+38  

 double

 8 byte

 2.2250738585E-308 ~

 1.7976931349E+308

 long double

 8 byte

 Double과 같습니다.

알고 계시면 좋은 것이 MS에서 공식 다큐에서는 float는 6~7자리를 유효 자릿 수로 알려주고 있습니다.

double은 15~16자리를 자릿수로 알려주고 있습니다.

저는 여태 6자리와 15자리로 알고 있었는데 어떤 차이인지는 아직까지는 알 수가 없네요.

unsigned 데이터 타입

 데이터 타입명

 데이터 크기 

 값의 범위 

 unsigned char

 1 byte

 0~255 

 unsigned short

 2 byte

 0~65,535

 unsigned int

 4 byte

 0~4,294,967,295

 unsigned long

 4 byte

 0~4,294,967,295

unsigned의 경우 양수 전용 이라고 생각하시면 될 것 같습니다.

변수를 사용하실 때 필요한 데이터의 크기나 유형에 따라서 변수의 데이터 형태를 잘 보고 지정 해주셔야 원하는 결과를 얻으실 수 있습니다.

감사합니다

Laonbud-Notice

프로그램/C

C에서 변수의 Type 검사

developers 2011. 11. 23. 00:32

문자가 알파벳인지, 숫자인지, 출력 가능한지, 공백인지 등을 확인하는 작업은 스스로 코딩을 해도 손쉽게 할 수 있는데,
만들어진 api를 이용하면 훨씬 더 편합니다.(당연한 얘기네요... ^^;;)
API를 활용하면 또한 소스마다 공통적으로 쓰이니 습관이 들면 코드 이해 하는데도 용이한 측면이 있고,

안정성에도 검증이 되어 있다는 점 때문에 비교적 안심하고 사용할 수가 있죠.
 

ctype.h에는 이런 검사를 할 수 있는 여러 api가 존재합니다.
그 중에 기억할 만한 것들 몇가지를 정리 해볼까 합니다. 


1. isalnum(int ch) 

->전달 인자가 영문자나 숫자이면 true

2. isalpha(int ch)

->전달 인자가 영문자이면 true

3. iscntl(int ch)

->전달 인자가 제어 문자이면 true

4. isdigit(int ch)

->전달 인자가 0-9 인 십진 숫자이면 true

5. isgraph(int ch)

->전달 인자가 공백이 아닌, 인쇄할 수 있는 문자이면 true

6. islower(int ch)

->전달 인자가 소문자이면 true

7. isupper(int ch)

->전달 인자가 대문자이면 true

8. isprint(int ch)

-> 전달 인자가 빈 칸을 포함하여 인쇄할 수 있는 문자이면 true

9. ispunct(int ch)

-> 전달 인자가 구두점 문자이면 true

10. isspace(int ch)

-> 전달 인자가 공백 문자(공백, 새줄, 캐리지 리턴, 수평 탭, 수직 탭, 용지 이동)이면 true

11. isxdigit(int ch)

-> 전달 인자가 16진 숫자(0-9, a-f, A-F)이면 true

12. tolower(int ch)

-> ch의 소문자를 리턴

13. toupper(int ch)

-> ch의 대문자를 리턴

위 API들은 /usr/include/ctype.h에 정의되어 있습니다.

내부적으로 코드를 보면 비트 마스킹을 이용합니다.

enum

{

_ISupper = _ISbit (0),    /* UPPERCASE.  */

_ISlower = _ISbit (1),    /* lowercase.  */

_ISalpha = _ISbit (2),    /* Alphabetic.  */

_ISdigit = _ISbit (3),    /* Numeric.  */

_ISxdigit = _ISbit (4),   /* Hexadecimal numeric.  */

_ISspace = _ISbit (5),    /* Whitespace.  */

_ISprint = _ISbit (6),    /* Printing.  */

_ISgraph = _ISbit (7),    /* Graphical.  */

_ISblank = _ISbit (8),    /* Blank (usually SPC and TAB).  */

_IScntrl = _ISbit (9),    /* Control character.  */

_ISpunct = _ISbit (10),   /* Punctuation.  */

_ISalnum = _ISbit (11)    /* Alphanumeric.  */

};

이런 형태로  대문자의 경우 특정 bit값이 어떤 값인지,

소문자의 경우 특정 bit값이 어떤 값인지 확인해서 type이 맞는지 알아내죠.

위 함수들의 리턴 값이 boolean인지 int인지, 소문자로 변환하는 경우 문자가 아닐때의 반응 같은 것을 잘 몰라서,
확인해 볼겸 한번 테스트를 해봤습니다.(중요하지 않은 부분이니 스킵하셔도 무관합니다.)


이것의 결과는 다음과 같습니다.

즉, 리턴 값은 true값이 아닌 0이 아닌 int값입니다.

또한 tolower함수같은 경우 영문자가 아닌 경우는 입력 인자 값을 그대로 리턴하는 것을 알 수 있겠네요.