주간 팁 #175: C++14와 C++17의 리터럴 상수 변경 사항
원래 TotW #175으로 2020년 1월 30일 게시됨
작성자: James Dennett
2020-04-06 업데이트됨
빠른 링크: abseil.io/tips/175
“변하지 않는 유일한 것은 변화뿐이다.”
- 멜리사 에더리지
개요
C++는 이제 숫자 리터럴을 더 읽기 쉽게 만들어주는 몇 가지 기능을 제공합니다.
- 정수 리터럴은 이제 2진수(
0b00101010
)로 작성할 수 있으며, 이는 기존의 10진수(42
), 16진수(0x2A
), 8진수(052
) 형식과 함께 지원됩니다. - 작은따옴표(
'
)는 숫자 리터럴에서 자릿수를 구분하는 데 사용될 수 있습니다 (0xDEAD'C0DE
). - 부동소수점 리터럴은 16진수 형식(
0x2A0p-4
)으로 지정할 수 있습니다.
2진수 리터럴
0b1110'0000
과 같은 2진수 리터럴은 비트 집합을 조작하거나 저수준 프로토콜과 작업할 때 기존의 16진수(가장 좋은 대안)보다 더 읽기 쉽습니다.
자릿수 구분자
C++14에서는 숫자 리터럴에서 작은따옴표('
)를 사용하여 자릿수를 그룹화할 수 있습니다. 이러한 구분자는 상수 값에 아무런 영향을 미치지 않으며, 오직 가독성을 높이는 역할만 합니다. 구분자를 사용하면 자릿수를 한눈에 파악할 수 있고, 숫자가 누락되지 않았는지 쉽게 확인할 수 있습니다. 예를 들어, 1'000'000'000
은 1000000000
보다 10억이라는 의미를 더 명확하게 전달합니다(그리고 1e9
와는 달리 정수입니다, 부동소수점 값이 아닙니다).
구분자 그룹의 크기에는 제한이 없으며, 한 리터럴 내에서도 일관성을 유지할 필요는 없습니다. 예를 들어, 0b1'001'0001
은 숫자 145를 나타내는 유효한 표현이며, 바이트가 세 개의 별도 필드로 해석될 때 유용할 수 있습니다.
16진수 부동소수점 리터럴
대부분의 10진수 부동소수점 리터럴은 대부분의 컴퓨터에서 사용되는 이진 부동소수점 형식으로 정확히 표현되지 않습니다. 그러나 16진수 부동소수점 리터럴은 충분한 비트를 사용할 경우 부동소수점의 비트 패턴에 직접적으로 매핑됩니다. 이를 통해 리터럴을 부동소수점 형식으로 변환할 때 발생할 수 있는 반올림 오류를 피할 수 있습니다(단, 16진수 숫자가 너무 많으면 잘림 오류는 여전히 발생할 수 있습니다).
16진수 부동소수점 리터럴은 p
(또는 P
)를 사용하여 유효숫자와 지수를 구분합니다. 이는 10진수 부동소수점 리터럴에서 e
(또는 E
)를 사용하는 것과 같습니다. 예를 들어, 0x2Ap12
는 값 0x2A << 12
(즉, 0x2A000
)를 표현하는 또 다른 방식이지만, 이는 정수가 아닌 부동소수점 값입니다. 따라서 스타일 가이드에서는 이를 명시적으로 부동소수점 값으로 나타내기 위해 0x2A.0p12
로 작성할 것을 요구합니다.
지수는 항상 10진수로 작성되며, 2의 거듭제곱을 나타내고 음수일 수도 있습니다. 예를 들어, 0x1p-10
은 정확히 1.0/1024
를 의미합니다.
권장 사항
- 2진수 리터럴은 비트 조작이 중요한 코드에서만 적절히 사용하세요.
- 숫자 리터럴이 한눈에 이해하기 어려울 정도로 길다면 자릿수 구분자 사용을 고려하세요.
- 자릿수 구분자를 사용할 때는 관례적인 그룹 크기를 따르세요:
- 10진수는 세 자리씩 그룹화하세요(특정 통화와 같이 다른 관례가 있는 경우는 제외).
- 2진수는 네 비트(니블) 또는 여덟 비트(바이트) 단위로 그룹화하세요. 하지만 특정 의미론적 그룹화가 더 적합하다면 이를 따르세요.
- 16진수는 2, 4, 또는 8개의 16진수 숫자 단위로 그룹화하세요.