Integer literal
정수 타입의 값들이 표현식에서 직접 사용될 수 있도록 허용합니다.
목차구문정수 리터럴은 다음과 같은 형식을 가집니다
여기서
정수 리터럴(다른 모든 리터럴과 마찬가지로)은 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 리터럴의 타입정수 리터럴의 타입은 값이 들어갈 수 있는 첫 번째 타입으로, 숫자 기수와 사용된 정수 접미사에 따라 달라지는 타입 목록에서 선택된다:
값이 크기 접미사가 없는(C++23부터) 정수 리터럴이 접미사/기수 조합에서 허용되는 어떤 타입에도 들어갈 수 없고 컴파일러가 리터럴 값을 표현할 수 있는 확장 정수 타입(예: 참고 사항
정수 리터럴 내의 문자들은 대소문자를 구분하지 않습니다:
음의 정수 리터럴은 존재하지 않습니다. - 1 와 같은 표현식은 리터럴이 나타내는 값에 단항 마이너스 연산자 를 적용하는 것으로, 암시적 형 변환이 수반될 수 있습니다. C99 이전의 C 언어에서(하지만 C++에서는 아님), 접미사가 없는 10진수 값이 long int 에 맞지 않는 경우 unsigned long int 타입을 가질 수 있습니다.
최대한 많이 인식(maximal munch)
규칙으로 인해, 16진수 정수 리터럴이
auto x = 0xE+2.0; // 오류 auto y = 0xa+2.0; // 정상 auto z = 0xE +2.0; // 정상 auto q = (0xE)+2.0; // 정상 그렇지 않으면, 단일의 유효하지 않은 전처리 숫자 토큰이 형성되어 이후 분석이 실패하게 됩니다.
예제
이 코드 실행
#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++ 표준에 소급 적용되었습니다.
참고문헌
참고 항목
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||