Integer constant
Позволяет использовать значения целочисленного типа непосредственно в выражениях.
Содержание |
Синтаксис
Целочисленная константа представляет собой не-lvalue выражение вида
| decimal-constant integer-suffix (необязательно) | (1) | ||||||||
| octal-constant integer-suffix (необязательно) | (2) | ||||||||
| hex-constant integer-suffix (необязательно) | (3) | ||||||||
| binary-constant integer-suffix (необязательно) | (4) | (начиная с C23) | |||||||
где
-
decimal-constant
— это ненулевая десятичная цифра (
1,2,3,4,5,6,7,8,9), за которой следует ноль или более десятичных цифр (0,1,2,3,4,5,6,7,8,9) -
octal-constant
— это цифра ноль (
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).
Следующие переменные инициализируются одним и тем же значением:
int d = 42; int o = 052; int x = 0x2a; int X = 0X2A; int b = 0b101010; // C23
` и `` сохранен без изменений, как и требовалось. HTML-теги и атрибуты также остались нетронутыми.
Следующие переменные также инициализируются тем же значением:
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 .
| суффикс | десятичные основания | другие основания |
|---|---|---|
| без суффикса |
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
|
оба
l
/
L
и
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) |
оба
ll
/
LL
и
u
/
U
|
unsigned long long int (начиная с C99) | unsigned long long int (начиная с C99) |
wb
или
WB
|
_BitInt ( N ) где ширина N является наименьшим N больше 1, которое может вместить значение и бит знака (начиная с C23) | _BitInt ( N ) где ширина N является наименьшим N больше 1, которое может вместить значение и бит знака (начиная с C23) |
оба
wb
/
WB
и
u
/
U
|
unsigned _BitInt ( N ) где ширина N является наименьшим N больше 0, которое может вместить значение (начиная с C23) | unsigned _BitInt ( N ) где ширина N является наименьшим N больше 0, которое может вместить значение (начиная с 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) |
Целочисленные константы могут использоваться в целочисленных константных выражениях .
В связи с
принципом максимального поглощения
, шестнадцатеричные целочисленные константы, оканчивающиеся на
e
и
E
, при последующем использовании операторов
+
или
-
, должны отделяться от оператора пробелом или скобками в исходном коде:
int x = 0xE+2; // ошибка int y = 0xa+2; // OK int z = 0xE +2; // OK int q = (0xE)+2; // OK
В противном случае формируется единственная некорректная лексема препроцессорного числа, что приводит к сбою дальнейшего анализа.
Пример
#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); // тип является 64-битным (unsigned long long или возможно unsigned long) // даже без суффикса long printf("12345678901234567890u = %"PRIu64"\n", 12345678901234567890u ); // printf("%lld\n", -9223372036854775808); // Ошибка: // значение 9223372036854775808 не помещается в signed long long, который // является наибольшим типом, допустимым для десятичной целочисленной константы без суффикса printf("%llu\n", -9223372036854775808ull ); // унарный минус, примененный к беззнаковому значению, вычитает его из 2^64, // это дает беззнаковое значение 9223372036854775808 printf("%lld\n", -9223372036854775807ll - 1); // правильный способ формирования знакового значения -9223372036854775808 }
Вывод:
123 = 123 0123 = 83 0x123 = 291 12345678901234567890ull = 12345678901234567890 12345678901234567890u = 12345678901234567890 9223372036854775808 -9223372036854775808
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 6.4.4.1 Целочисленные константы (стр. 57-60)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 6.4.4.1 Целочисленные константы (стр: 45-46)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 6.4.4.1 Целочисленные константы (стр: 62-64)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 6.4.4.1 Целочисленные константы (стр: 54-56)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 3.1.3.2 Целочисленные константы
Смотрите также
|
C++ documentation
для
Integer literal
|