Namespaces
Variants

Integer literal

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

정수 타입의 값들이 표현식에서 직접 사용될 수 있도록 허용합니다.

목차

구문

정수 리터럴은 다음과 같은 형식을 가집니다

decimal-literal integer-suffix  (선택적) (1)
octal-literal integer-suffix  (선택적) (2)
hex-literal integer-suffix  (선택적) (3)
binary-literal integer-suffix  (선택적) (4) (C++14부터)

여기서

  • decimal-literal 은 0이 아닌 십진수 숫자( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )로 시작하며, 그 뒤에 0개 이상의 십진수 숫자( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )가 옵니다.
  • octal-literal 은 숫자 0( 0 )으로 시작하며, 그 뒤에 0개 이상의 팔진수 숫자( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 )가 옵니다.
  • hex-literal 은 문자 시퀀스 0x 또는 문자 시퀀스 0X 로 시작하며, 그 뒤에 하나 이상의 십육진수 숫자( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , a , A , b , B , c , C , d , D , e , E , f , F )가 옵니다.
  • binary-literal 은 문자 시퀀스 0b 또는 문자 시퀀스 0B 로 시작하며, 그 뒤에 하나 이상의 이진수 숫자( 0 , 1 )가 옵니다.
  • integer-suffix 가 제공되는 경우, 다음 중 하나 또는 둘 모두를 포함할 수 있습니다(둘 다 제공되는 경우 순서는 상관없음):
  • unsigned-suffix (문자 u 또는 문자 U )
  • 다음 중 하나
  • long-suffix (문자 l 또는 문자 L )
  • long-long-suffix (문자열 ll 또는 문자열 LL )
(C++11부터)
  • size-suffix (문자 z 또는 문자 Z )
(C++23부터)

선택적으로 단일 따옴표( ' )를 숫자 사이에 구분자로 삽입할 수 있습니다; 이들은 리터럴의 값을 결정할 때 무시됩니다.

(since C++14)

정수 리터럴(다른 모든 리터럴과 마찬가지로)은 primary expression 입니다.

설명

1) 십진수 정수 리터럴 (base 10).
2) 8진수 정수 리터럴(기수 8).
3) 16진수 정수 리터럴 (진법 16, 'a' 부터 'f' 까지의 문자는 (10진수) 10부터 15까지의 값을 나타냅니다).
4) 이진 정수 리터럴(기수 2).

정수 리터럴의 첫 번째 숫자가 가장 유효 숫자입니다.

예제. 다음 변수들은 동일한 값으로 초기화됩니다:

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
int b = 0b101010; // C++14

예시. 다음 변수들도 동일한 값으로 초기화됩니다:

unsigned long long l1 = 18446744073709550592ull;       // C++11
unsigned long long l2 = 18'446'744'073'709'550'592llu; // C++14
unsigned long long l3 = 1844'6744'0737'0955'0592uLL;   // C++14
unsigned long long l4 = 184467'440737'0'95505'92LLU;   // C++14

리터럴의 타입

정수 리터럴의 타입은 해당 값이 들어갈 수 있는 첫 번째 타입으로, 이 목록은 사용된 숫자 기수와 integer-suffix 에 따라 달라지는 타입 목록에서 결정됩니다:

접미사 10진수 기수 2진수, 8진수 또는 16진수 기수
(접미사 없음)
  • int
  • long int
  • long long int (C++11 이후)
  • int
  • unsigned int
  • long int
  • unsigned long int
  • long long int (C++11 이후)
  • unsigned long long int (C++11 이후)
u 또는 U
  • unsigned int
  • unsigned long int
  • unsigned long long int (C++11 이후)
  • unsigned int
  • unsigned long int
  • unsigned long long int (C++11 이후)
l 또는 L
  • long int
  • unsigned long int (C++11 이전)
  • long long int (C++11 이후)
  • long int
  • unsigned long int
  • long long int (C++11 이후)
  • unsigned long long int (C++11 이후)
both l / L
and u / U
  • unsigned long int
  • unsigned long long int (C++11 이후)
  • unsigned long int
  • unsigned long long int (C++11 이후)
ll 또는 LL
  • long long int (C++11부터)
  • long long int (C++11부터)
  • unsigned long long int (C++11부터)
both ll / LL
and u / U
  • unsigned long long int (since C++11)
  • unsigned long long int (since C++11)
z 또는 Z
both z / Z
and u / U

정수 리터럴의 값이 크기 접미사가 없는 size-suffix (C++23부터) 경우, 접미사/기수 조합으로 허용되는 어떤 타입에도 너무 커서 들어맞지 않고 컴파일러가 리터럴의 값을 표현할 수 있는 확장 정수 타입(예: __int128 )을 지원한다면, 해당 리터럴은 그 확장 정수 타입을 가질 수 있습니다. 그렇지 않으면 프로그램은 ill-formed입니다.

참고 사항

정수 리터럴 내의 문자들은 대소문자를 구분하지 않습니다: 0xDeAdBeEfU 0XdeadBEEFu 는 동일한 숫자를 나타냅니다 (한 가지 예외는 long-long-suffix 로, ll 또는 LL 만 가능하며 lL Ll 은 불가능합니다) (C++11부터) .

음의 정수 리터럴은 존재하지 않습니다. - 1 와 같은 표현식은 리터럴이 나타내는 값에 단항 마이너스 연산자 를 적용하는 것으로, 암시적 형 변환이 수반될 수 있습니다.

C99 이전의 C 언어에서(하지만 C++에서는 아님), 접미사가 없는 10진수 값이 long int 에 맞지 않는 경우 unsigned long int 타입을 가질 수 있습니다.

#if 또는 #elif 의 제어 표현식에서 사용될 때, 모든 부호 있는 정수 상수는 std::intmax_t 타입을 가진 것처럼 동작하고, 모든 부호 없는 정수 상수는 std::uintmax_t 타입을 가진 것처럼 동작합니다.

(C++11부터)

최대한 많이 인식(maximal munch) 규칙으로 인해, 16진수 정수 리터럴이 e 또는 E 로 끝나고, 그 뒤에 연산자 + 또는 - 가 올 경우, 소스 코드에서 공백이나 괄호로 구분해야 합니다:

auto x = 0xE+2.0;   // 오류
auto y = 0xa+2.0;   // 정상
auto z = 0xE +2.0;  // 정상
auto q = (0xE)+2.0; // 정상

그렇지 않으면, 단일의 유효하지 않은 전처리 숫자 토큰이 형성되어 이후 분석이 실패하게 됩니다.

기능 테스트 매크로 표준 기능
__cpp_binary_literals 201304L (C++14) 2진수 리터럴
__cpp_size_t_suffix 202011L (C++23) std::size_t 및 부호 있는 버전을 위한 리터럴 접미사

예제

#include <cstddef>
#include <iostream>
#include <type_traits>
int main()
{
    std::cout << 123 << '\n'
              << 0123 << '\n'
              << 0x123 << '\n'
              << 0b10 << '\n'
              << 12345678901234567890ull << '\n'
              << 12345678901234567890u << '\n'; // 자료형은 unsigned long long
                                                // long long 접미사 없이도
//  std::cout << -9223372036854775808 << '\n'; // 오류: 값
               // 9223372036854775808은 접미사 없는 10진 정수 리터럴에 허용되는
               // 가장 큰 자료형인 signed long long에 맞지 않음
    std::cout << -9223372036854775808u << '\n'; // 부호 없는 값에 단항 마이너스 적용 시
               // 2^64에서 빼므로 9223372036854775808이 됨
    std::cout << -9223372036854775807 - 1 << '\n'; // 값 -9223372036854775808을
                                                   // 계산하는 올바른 방법
#if __cpp_size_t_suffix >= 202011L // C++23
    static_assert(std::is_same_v<decltype(0UZ), std::size_t>);
    static_assert(std::is_same_v<decltype(0Z), std::make_signed_t<std::size_t>>);
#endif
}

출력:

123
83
291
2
12345678901234567890
12345678901234567890
9223372036854775808
-9223372036854775808

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 2698 C++23 size-suffix 를 가진 정수 리터럴이 확장 정수 타입을 가질 수 있었음 너무 큰 경우 오류 형식

참고문헌

  • C++23 표준 (ISO/IEC 14882:2024):
  • 5.13.2 정수 리터럴 [lex.icon]
  • C++20 표준(ISO/IEC 14882:2020):
  • 5.13.2 정수 리터럴 [lex.icon]
  • C++17 표준 (ISO/IEC 14882:2017):
  • 5.13.2 정수 리터럴 [lex.icon]
  • C++14 표준(ISO/IEC 14882:2014):
  • 2.14.2 정수 리터럴 [lex.icon]
  • C++11 표준 (ISO/IEC 14882:2011):
  • 2.14.2 정수 리터럴 [lex.icon]
  • C++98 표준(ISO/IEC 14882:1998):
  • 2.13.1 정수 리터럴 [lex.icon]

참고 항목

사용자 정의 리터럴 (C++11) 사용자 정의 접미사를 가진 리터럴
C 문서 for 정수 상수