Integer literal
정수 타입의 값들이 표현식에서 직접 사용될 수 있도록 허용합니다.
목차 |
구문
정수 리터럴은 다음과 같은 형식을 가집니다
| 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-suffix
(문자
-
unsigned-suffix
(문자
|
(C++11부터) |
|
(C++23부터) |
|
선택적으로 단일 따옴표( ' )를 숫자 사이에 구분자로 삽입할 수 있습니다; 이들은 리터럴의 값을 결정할 때 무시됩니다. |
(since C++14) |
정수 리터럴(다른 모든 리터럴과 마찬가지로)은 primary expression 입니다.
설명
정수 리터럴의 첫 번째 숫자가 가장 유효 숫자입니다.
예제. 다음 변수들은 동일한 값으로 초기화됩니다:
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진수 기수 |
|---|---|---|
| (접미사 없음) |
|
|
u
또는
U
|
|
|
l
또는
L
|
|
|
both
l
/
L
and
u
/
U
|
|
|
ll
또는
LL
|
|
|
both
ll
/
LL
and
u
/
U
|
|
|
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
정수 상수
|
|