본문 바로가기

C++/C, C++, STL

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

더보기

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

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

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

cpp
닫기
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)로 표현됩니다.

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

정수 리터럴: 10진수

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

cpp
닫기
int i = 157;

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

cpp
닫기
#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 사이 숫자의 연속으로 구성합니다.

cpp
닫기
int i = 0377;

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

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

정수 리터럴: 16진수

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

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

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

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

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

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

cpp
닫기
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 전용이며 다른 환경에서 호환되지 않을 수 있으므로 권장하지 않습니다.

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

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

정수 리터럴: 이진 리터럴

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

cpp
닫기
auto i = 0b000001; // int auto j = 0B001101; // int

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

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

cpp
닫기
double i = 18.46; double j = 38.;

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

cpp
닫기
double i = 18.46e0; // 18.46 double j = 18.46e1; // 184.6

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

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

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

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

cpp
닫기
#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을 사용합니다.

cpp
닫기
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)로 표현합니다.