Namespaces
Variants

Integer constant

From cppreference.net

Позволяет использовать значения целочисленного типа непосредственно в выражениях.

Содержание

Синтаксис

Целочисленная константа представляет собой не-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)

Необязательные одинарные кавычки ( ' ) могут быть вставлены между цифрами в качестве разделителя. Они игнорируются компилятором.

(начиная с C23)

Объяснение

1) Десятичная целочисленная константа (основание 10, первая цифра является наиболее значимой).
2) Восьмеричная целочисленная константа (основание 8, первая цифра является наиболее значимой).
3) Шестнадцатеричная целочисленная константа (основание 16, первая цифра является наиболее значимой, буквы a через f представляют десятичные значения от 10 до 15).
4) Двоичная целочисленная константа (основание 2, первая цифра является наиболее значимой).

Следующие переменные инициализируются одним и тем же значением:

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
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)

оба 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