본문 바로가기

C++/C, C++, STL

정수, 부동 소수점, 부울 및 포인터 리터럴

더보기

리터럴(Literals)은 값을 직접적으로 표현하는 프로그램 요소입니다.

리터럴은 여러 컨텍스트에서 사용 할 수 있지만 가장 일반적인 사용은 변수의 초기화 그리고 함수에 인자 전달입니다.

C++의 정수 부동 소수점 부울포인터 리터럴 유형은 다음과 같습니다.

const int answer = 43;	// integer literal
double d = sin(108.87);	// floating point literal passed to sin function
bool b = true;		// boolean literal
MyClass* mc = nullptr;	// pointer literal

일부 리터럴의 경우 접두사 및 접미사를 추가 컴파일러에게 해석하는 방법을 알려야 합니다.

예를 들어 0x35의 접두사 0x는 컴파일러에게 이어지는 숫자를 16진수로 해석하도록 알리는 목적입니다.

정수 리터럴(Integer literals)

정수 리터럴은 10진수(Decimal) 이진(Binary) 8진수(Octal) 16진수(Hexadecimal)로 표현됩니다.

int i = 157;		// decimal literal
int j = 0198;		// octal literal
int k = 0x3fff;		// hexadecimal literal

정수 리터럴: 10진수

10진수 정수 리터럴을 지정하려면 0이 아닌 숫자로 시작합니다.

int i = 157;

리터럴이 표현하는 값의 크기에 따라서 컴파일러는 정수 리터럴을 int(32Bit) 또는 long long(64Bit) 타입으로 결정합니다.

#include <iostream>

int main()
{
	std::cout << 360 << " is " << typeid(360).name() << std::endl;			// __int32
	std::cout << 3600000000 << " is " << typeid(3600000000).name() << std::endl;	// __int64
}

정수 리터럴: 8진수

8진수 정수 리터럴을 지정하려면 0으로 시작하여 나머지 리터럴은 0부터 7 사이 숫자의 연속으로 구성합니다.

int i = 0377;

이어지는 숫자 시퀀스는 7을 초과 할 수 없습니다.

int i = 0397;	// Error: 9 is not octal digit

정수 리터럴: 16진수

16진수 정수 리터럴을 지정하려면 0x 또는 0X로 시작하여 나머지 리터럴은 0부터 15 사이 숫자의 연속으로 구성합니다.

이때 16진수 숫자 10부터 15까지의 값은 A부터 F(또는 a부터 f)로 나타냅니다.

int i = 0x3fff;
int j = 0X3FFF;	// equal to 'i' variable

정수 리터럴: 부호 없는 형식, 큰 숫자 표현

부호 없는 형식은 u 또는 U 접미사를 사용합니다.

더 큰 값을 표현하기 위해 long 타입은 l 또는 L 접미사를, long long 타입은 ll 또는 LL 접미사를 사용합니다.

unsigned i = 328u;			// unsigned value
long j = 0x7FFFFFL;			// long value specified as hex literal
unsigned long k = 0776745ul;		// unsigned long value
auto n = 108LL;				// signed long long
auto m = 0x8000000000000000ULL << 16;	// unsigned long long
더보기

i64 접미사는 Microsoft 전용이며 다른 환경에서 호환되지 않을 수 있으므로 권장하지 않습니다.

작은 따옴표 ' 문자를 사용하면 큰 숫자를 표현할 때 가독성을 높일 수 있습니다.

long long i = 24'847'458'121;
long long j = 24847458121;	// equal to 'i' variable

정수 리터럴: 이진 리터럴

이진 리터럴은 0b 또는 0B 접두사로 시작하며 나머지 리터럴은 0 또는 1 숫자의 연속으로 구성합니다.

auto i = 0b000001;	// int
auto j = 0B001101;	// int

부동 소수점 리터럴(Floating point literals)

부동 소수점 리터럴은 소수 부분이 있어야 하는 값을 표현합니다. 이러한 값은 소수점 .으로 구분되며 지수를 포함합니다.

double i = 18.46;
double j = 38.;

지수가 있는 경우라면 e 또는 E 리터럴을 사용해 10의 거듭제곱으로 지정합니다.

double i = 18.46e0;		// 18.46
double j = 18.46e1;		// 184.6

부동 소수점 리터럴은 기본적으로 double 타입으로 결정됩니다.

만약 접미사 f 또는 F 그리고 l 또는 L을 사용하는 경우 리터럴을 float 그리고 long double 타입으로 지정 할 수 있습니다.

auto i = 18.46;		// double 
auto j = 18.46F;	// float
auto k = 18.46L;	// long double

doublelong double 형식의 표현 값은 동일하지만, 실제는 다른 타입으로 오버로드 될 수 있습니다.

#include <iostream>

void func(double)
{
	std::cout << "double func() called" << std::endl;
};

void func(long double)
{
	std::cout << "long double func() called" << std::endl;
};

int main()
{
	func(123.456);		// double func() called
	func(123.456L);		// long double func() called
}

부울 리터럴(Boolean literals)

부울 형식의 리터럴은 단순히 true 또는 false로 표현됩니다.

포인터 리터럴(Pointer literals)

C++ 11부터 nullptr 리터럴을 도입하여 초기화되지 않은 포인터를 나타낼 수 있습니다.

다른 버전과의 호환성을 고려한다면 기존처럼 NULL을 사용합니다.

char* i = nullptr;
char* j = NULL;

정리 및 복습

  • 10진수 정수는 0이 아닌 숫자로 시작합니다.
  • 8진수 정수는 0으로 시작하며 이어지는 리터럴은 0부터 7 사이의 값으로 표현합니다.
  • 16진수 정수는 0x 또는 0X로 시작하며 이어지는 리터럴은 0부터 15 사이의 값으로 표현합니다.
  • 16진수 정수에서 10부터 15 사이의 값은 a부터 f 또는 A부터 F로 표현합니다. 
  • 이진수 정수는 0b 또는 0B로 시작하며 이어지는 리터럴은 0또는 1로 표현합니다.
10진수 8진수 16진수 이진수
0이 아닌 숫자로 시작 0으로 시작 0x 또는 0X로 시작 0b 또는 0B로 시작
  • 부동 소수점.으로 정수와 소수분을 구분합니다.
  • 부동 소수점에서 지수가 있는 경우라면 e 또는 E 리터럴을 사용해 10의 거듭제곱으로 지정합니다.
double float long dobule
별도의 리터럴로 지정하지 않은 경우 f 또는 F 리터럴로 타입 지정 l 또는 L 리터럴로 타입 지정
  • 부울true 또는 false로 표현합니다.
  • 포인터에서 초기화되지 않은 포인터는 NULL 또는 nullptr(C++ 11)로 표현합니다.