Namespaces
Variants

Integer constant

From cppreference.net

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

목차

구문

정수 상수는 다음과 같은 형태의 비좌측값 표현식입니다

decimal-constant integer-suffix  (선택적) (1)
octal-constant integer-suffix  (선택적) (2)
hex-constant integer-suffix  (선택적) (3)
binary-constant integer-suffix  (선택적) (4) (C23 이후)

여기서

  • decimal-constant 는 0이 아닌 십진수 숫자( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )로 시작하며, 그 뒤에 0개 이상의 십진수 숫자( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )가 옵니다.
  • octal-constant 는 숫자 0( 0 )으로 시작하며, 그 뒤에 0개 이상의 팔진수 숫자( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 )가 옵니다.
  • hex-constant 는 문자 시퀀스 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-constant 는 문자 시퀀스 0b 또는 문자 시퀀스 0B 로 시작하며, 그 뒤에 하나 이상의 이진수 숫자( 0 , 1 )가 옵니다.
  • integer-suffix 가 제공되는 경우, 다음 중 하나를 포함할 수 있습니다 (단, unsigned 접두사는 다른 접미사와 결합될 수 있으며, 두 개의 접미사가 사용될 경우 순서는 상관없습니다):
  • unsigned-suffix (문자 u 또는 문자 U )
  • long-suffix (문자 l 또는 문자 L ) 또는 long-long-suffix (문자 시퀀스 ll 또는 문자 시퀀스 LL ) (C99부터)
  • bit-precise-int-suffix (문자 시퀀스 wb 또는 문자 시퀀스 WB ) (C23부터)

선택적으로 단일 따옴표( ' )를 숫자 사이에 구분자로 삽입할 수 있습니다. 컴파일러는 이를 무시합니다.

(C23부터)

설명

1) 십진 정수 상수 (10진법, 첫 번째 숫자가 가장 상위 비트입니다).
2) 8진수 정수 상수 (기수 8, 첫 번째 숫자가 가장 유효한 비트입니다).
3) 16진수 정수 상수 (기수 16, 첫 번째 숫자가 가장 유효하며, a 부터 f 까지의 문자는 10부터 15까지의 10진수 값을 나타냅니다).
4) 이진 정수 상수(밑수 2, 첫 번째 숫자가 최상위 비트).

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

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
int b = 0b101010; // C23

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

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

정수 상수의 타입

정수 상수의 타입은 해당 값이 들어갈 수 있는 첫 번째 타입으로, 이 타입 목록은 사용된 숫자 기수와 integer-suffix 에 따라 달라집니다.

정수 상수에 허용되는 타입
접미사 10진법 기수 기타 기수
접미사 없음 int

long int
unsigned long int (C99 이전)
long long int (C99 이후)

int

unsigned int
long int
unsigned long int
long long int (C99 이후)
unsigned long long int (C99 이후)

u 또는 U unsigned int

unsigned long int
unsigned long long int (C99 이후)

unsigned int

unsigned long int
unsigned long long int (C99 이후)

l 또는 L long int

unsigned long int (C99 이전)
long long int (C99 이후)

long int

unsigned long int
long long int (C99 이후)
unsigned long long int (C99 이후)

both l / L and u / U unsigned long int

unsigned long long int (C99 이후)

unsigned long int

unsigned long long int (C99 이후)

ll 또는 LL long long int (C99부터) long long int (C99부터)

unsigned long long int (C99부터)

both ll / LL u / U unsigned long long int (C99 이후) unsigned long long int (C99 이후)
wb 또는 WB _BitInt ( N ) 여기서 너비 N은 값과 부호 비트를 수용할 수 있는 1보다 큰 가장 작은 N입니다 (C23부터) _BitInt ( N ) 여기서 너비 N은 값과 부호 비트를 수용할 수 있는 1보다 큰 가장 작은 N입니다 (C23부터)
both wb / WB and u / U unsigned _BitInt ( N ) where the width N is the smallest N greater than 0 which can accommodate the value (C23부터) unsigned _BitInt ( N ) where the width N is the smallest N greater than 0 which can accommodate the value (C23부터)

정수 상수의 값이 접미사/기수 조합으로 허용되는 어떤 타입에도 담기에는 너무 큰 경우, 접미사 wb , WB , uwb , 또는 UWB 가 없는 경우 (C23부터) 그리고 컴파일러가 확장 정수 타입(예: __int128 )을 지원한다면, 해당 상수는 확장 정수 타입을 부여받을 수 있습니다; 그렇지 않으면 프로그램은 형식에 맞지 않습니다.

참고 사항

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

음의 정수 상수는 존재하지 않습니다. - 1 와 같은 표현식은 상수가 나타내는 값에 단항 마이너스 연산자 를 적용한 것입니다.

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

(C99부터)

정수 상수는 정수 상수 표현식 에 사용될 수 있습니다.

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

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

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

예제

#include <inttypes.h>
#include <stdio.h>
int main(void)
{
    printf("123 = %d\n", 123);
    printf("0123 = %d\n", 0123);
    printf("0x123 = %d\n", 0x123);
    printf("12345678901234567890ull = %llu\n", 12345678901234567890ull);
    // the type is a 64-bit type (unsigned long long or possibly unsigned long)
    // even without a long suffix
    printf("12345678901234567890u = %"PRIu64"\n", 12345678901234567890u );
    // printf("%lld\n", -9223372036854775808); // Error:
        // the value 9223372036854775808 cannot fit in signed long long, which
        // is the biggest type allowed for unsuffixed decimal integer constant
    printf("%llu\n", -9223372036854775808ull );
    // unary minus applied to unsigned value subtracts it from 2^64,
    // this gives unsigned 9223372036854775808
    printf("%lld\n", -9223372036854775807ll - 1);
    // correct way to form signed value -9223372036854775808
}

출력:

123 = 123
0123 = 83
0x123 = 291
12345678901234567890ull = 12345678901234567890
12345678901234567890u = 12345678901234567890
9223372036854775808
-9223372036854775808

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 6.4.4.1 정수 상수 (p: 57-60)
  • C17 표준 (ISO/IEC 9899:2018):
  • 6.4.4.1 정수 상수 (p: 45-46)
  • C11 표준 (ISO/IEC 9899:2011):
  • 6.4.4.1 정수 상수 (p: 62-64)
  • C99 표준 (ISO/IEC 9899:1999):
  • 6.4.4.1 정수 상수 (p: 54-56)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 3.1.3.2 Integer constants

참고 항목

C++ 문서 for Integer literal