Integer constant
정수 타입의 값들이 표현식에서 직접 사용될 수 있도록 허용합니다.
목차 |
구문
정수 상수는 다음과 같은 형태의 비좌측값 표현식입니다
| 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부터)
-
unsigned-suffix
(문자
|
선택적으로 단일 따옴표(
|
(C23부터) |
설명
a
부터
f
까지의 문자는 10부터 15까지의 10진수 값을 나타냅니다).
다음 변수들은 동일한 값으로 초기화됩니다:
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
|
int
unsigned
int
|
u
또는
U
|
unsigned
int
unsigned
long
int
|
unsigned
int
unsigned
long
int
|
l
또는
L
|
long
int
unsigned
long
int
(C99 이전)
|
long
int
unsigned
long
int
|
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
|