자료형
기본 자료형은 크게 char, integer, floating-point, boolean, void, null이 있다.
숫자는 범위가 넓으므로 1byte, 4byte로 저장하는 메모리 크기가 다르게 된다. 문자는 컴퓨터가 알아들을 수 없으니, ASCII로 수로 바꾼 후, 이진수로 표시해 저장된다.
integer는 양수와 음수로 나뉘는데, 양의 정수와 음의 정수, 0을 표현할 때는 signed int(signed 생략가능), 양의 정수와 0을 포함할 때는 unsigned int를 사용한다. 우리가 평소에 쓰는 int는 signed이다.
float은 4byte이고 double은 float의 2배 8byte, 더 긴 타입(long double)도 있다.
boolean type에는 bool이 있는데 참 혹은 거짓을 판별할 때 사용한다.
#include <iostream>
int main()
{
using namespace std;
bool bValue = true;
char chValue = 65;
float fValue = 3.141592f; //마지막에 f를 표기하지않으면 double로 봄.
double dValue = 3.141592;
auto aValue = 3.141592;
auto aValue2 = 3.141592f;
cout << aValue << endl;
cout << aValue2 << endl;
cout << (bValue ? 1 : 0) << endl;
cout << chValue << endl;
cout << fValue << endl;
cout << dValue << endl;
return 0;
}
boolean 연산은 참과 거짓을 연산하는데, 3항 연산자를 이용하여 true(참)= 1이 출력된다.
char 연산자에는 65를 넣었지만 A가 출력된다.
float에는 마지막에 f를 표기하지않으면 컴퓨터는 이 데이터를 double로 인식하여 4byte가 초과되어서 정확도를 벗어난 수의 범위이기 때문에 경고메시지를 출력하게된다.
auto
auto aValue = 3.141592;
auto aValue2 = 3.141592f;
modern c++에는 auto 기능이 있어서, 자동으로 자료형을 지정하는데, aValue는 double. aValue2에는 float이 지정되고, sizeof로 출력하면 각각 8, 4 가 출력된다.
C#의 var과 비슷한 것 같다.
초기화 ( initialization )
int jin = 5017; // copy initialization
int jin(5017); // direct initialization
int jin{ 5017 }; // uniform initialization
초기화 방법 세가지중 direct initialization, uniform initialization은 객체지향에서 직접 만든 데이터 타입을 초기화 할때 사용한다. 그리고 uniform initialization은 데이터 타입이 맞지 않을 경우 컴파일 자체를 하지않고 에러가 나게된다.
정수형
#include <iostream>
int main()
{
using namespace std;
short s = 1; // 2 bytes = 2 * 8 bits = 16 bits
int i = 1;
long l = 1;
long long ll = 1;
cout << sizeof(short) << endl;
cout << sizeof(int) << endl;
cout << sizeof(long) << endl;
cout << sizeof(long long) << endl;
return 0;
}
출력결과 : 2 4 4 8 각 각의 데이터 타입이 메모리를 얼마나 차지하는지 모든 정수형의 범위에는 사용할 수 있는 범위가 있음을 알기 위해 sizeof를 이용하여 short는 1바이트에 8bits 들어있으므로, 총 16bits이고 표현할 수 있는 수의 개수는 2의 16승 만큼 표현할 수 있다.
#include <iostream>
#include <cmath>
#include <limits>
int main()
{
using namespace std;
short s = 1; // 2 bytes = 2 * 8 bits = 16 bits
cout << std::pow(2, sizeof(short) *8 - 1) - 1 << endl;
// 수의 범위
cout << std::numeric_limits<short>::max() << endl;
cout << std::numeric_limits<short>::min() << endl;
cout << std::numeric_limits<short>::lowest() << endl;
//32767 32767 -32768 -32768
//min과 lowest의 경우엔 0을 표현하기 위해 -1을 했기 때문이다.
//lowest는 부동소수점에 대해 사용했을 경우엔 min과 역할이 다르다.
return 0;
}
+,- 를표현하는 signed에 대해 1bit를 빼준것이고 0을 표현을 빼기위해 1을 또 뺀다.
결과 : 32767 (표현 가능한 가장 큰 수)
오버플로우 ( Overflow )
s = 32767;
s = s + 1; // 32768?
cout << s << endl; //overflow
출력결과 : -32768
표현할 수 있는 최대 범위를 넘어가면, 2진수에서는 최대치를 넘으면 돌아서 최소값으로 가게 됨.
반대로 s의 최소값을 출력한 뒤(-32768), 1을 빼고 나서 다시 출력을 하면, 최대값이 나온다.
고정너비 정수와 무치형 [ void ]
고정너비 정수
#include <iostream>
#include <cstdint>
int main()
{
using namespace std;
std::int16_t i(5);
std::int8_t myint = 65;
cout << myint << endl;
std::int_fast8_t fi(5);
std::int_least64_t fl(5);
return 0;
}
환경에 따라서 똑같은 int가 4 byte로 있는 경우도, 2 byte로 있는 경우도 있다. 항상 같은 값을 같게 하기 위해 등장한 게 이 '고정너비 정수'이다.
int16_t : 16bits == 2 byte로 사용하겠다 : short type
int8_t : 1 byte : char type으로 자동 변환되어 65 → ASCII 코드로 A로 나온다.
int_fast8_t : 8bits 중에 가장 빠른 데이터 타입 : signed char로 자동변환
int_least64_t : 적어도 64bits를 사용하겠다: 8 byte, longlong 타입
( 멀티 플랫폼 프로그래밍을 할때 주로 사용함.)
보이드 (Void)
#include <iostream>
void my_function()
{
}
int main()
{
int i = 123;
float f = 123.456f;
void* my_void;
my_void = (void*)&i;
my_void = (void*)&f;
return 0;
}
void는 데이터 타입이 없는 경우, 리턴(return) 되는 타입이 없음을 의미한다.
* 표시는 포인터에서 주소를 참조할 때 사용하는데, &i는 정수형 변수의 주소를 참조하고, &f는 실수형 변수의 주소를 참조하게 되는데, 데이터 저장소의 값은 둘 다 똑같은 크기를 갖기때문에 void*를 통해 둘다 형변환을 간편하게 할 수 있다.
'개발 > C++' 카테고리의 다른 글
[C++] 2.4 리터럴 상수, 심볼릭 상수 (0) | 2023.06.12 |
---|---|
[C++] 2.3 불리언 자료형과 if문, 문자형(Char) [캐스팅, 버퍼, limits] (0) | 2023.06.01 |
[C++] 2.2 부동소수점 (0) | 2023.06.01 |
[C++] 1.2 헤더파일과 헤더가드 [#pragma once] (0) | 2023.05.31 |
[C++] 1.1 변수, 연산자, 선언 (0) | 2023.05.30 |