命名空间
变体
操作

整数常量

来自 cppreference.com
< c‎ | 语言

允许整数类型的数值直接在表达式中使用。

内容

[编辑] 语法

整数常量是一个 非左值 表达式,形式如下

十进制常量 整数后缀 (可选) (1)
八进制常量 整数后缀 (可选) (2)
十六进制常量 整数后缀 (可选) (3)
二进制常量 整数后缀 (可选) (4) (自 C23)

其中

  • 十进制常量 是一个非零的十进制数字 (1, 2, 3, 4, 5, 6, 7, 8, 9),后面跟着零个或多个十进制数字 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
  • 八进制常量 是数字零 (0) 后面跟着零个或多个八进制数字 (0, 1, 2, 3, 4, 5, 6, 7)
  • 十六进制常量 是字符序列 0x 或字符序列 0X 后面跟着一个或多个十六进制数字 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D, e, E, f, F)
  • 二进制常量 是字符序列 0b 或字符序列 0B 后面跟着一个或多个二进制数字 (0, 1)
  • 整数后缀,如果存在,可以包含以下内容之一 (除了无符号前缀可以与其他内容组合;如果使用两个后缀,它们可以以任何顺序出现)
  • 无符号后缀 (字符 u 或字符 U)
  • 长整型后缀 (字符 l 或字符 L) 长长整型后缀 (字符序列 ll 或字符序列 LL)(自 C99)
  • 位精度整数后缀 (字符序列 wb 或字符序列 WB) (自 C23)

可选的单引号 (') 可以在数字之间插入作为分隔符。它们会被编译器忽略。

(自 C23)

[编辑] 解释

1) 十进制整数常量 (基数为 10,第一个数字是最高位)。
2) 八进制整数常量 (基数为 8,第一个数字是最高位)。
3) 十六进制整数常量 (基数为 16,第一个数字是最高位,字母 af 代表十进制值 10 到 15)。
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

[编辑] 整数常量的类型

整数常量的类型是在该值可以容纳的第一个类型,该类型列表取决于使用的数字基数和 整数后缀

允许用于整数常量的类型
后缀 十进制基数 其他基数
无后缀 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)

uU unsigned int

unsigned long int
unsigned long long int(自 C99)

unsigned int

unsigned long int
unsigned long long int(自 C99)

lL 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/Lu/U unsigned long int

unsigned long long int(自 C99)

unsigned long int

unsigned long long int(自 C99)

llLL long long int(自 C99) long long int(自 C99)

unsigned long long int(自 C99)

ll/LLu/U unsigned long long int(自 C99) unsigned long long int(自 C99)
wbWB _BitInt(N) 其中宽度 N 是大于 1 的最小 N,它可以容纳该值和符号位(自 C23) _BitInt(N) 其中宽度 N 是大于 1 的最小 N,它可以容纳该值和符号位(自 C23)
wb/WBu/U unsigned _BitInt(N) 其中宽度 N 是大于 0 的最小 N,它可以容纳该值(自 C23) unsigned _BitInt(N) 其中宽度 N 是大于 0 的最小 N,它可以容纳该值(自 C23)

如果整数常量的值太大,无法容纳在后缀/基数组合允许的任何类型中,它不包含后缀 wbWBuwbUWB(自 C23) 并且编译器支持扩展整数类型 (例如 __int128),则常量可以被赋予扩展整数类型;否则,程序将不符合要求。

[编辑] 注释

整数常量中的字母不区分大小写:0xDeAdBaBeU0XdeadBABEu 代表同一个数字 (一个例外是 长长整型后缀,它要么是 ll 要么是 LL,绝不是 lLLl)(自 C99)

没有负整数常量。诸如 -1 的表达式对常量表示的值应用 一元减运算符

#if #elif 的控制表达式中使用时,所有带符号整数常量都按其具有类型 intmax_t 处理,所有无符号整数常量都按其具有类型 uintmax_t 处理。

(自 C99)

整数常量可以在 整数常量表达式 中使用。

由于 最大化匹配,以 eE 结尾的十六进制整数常量,当后面跟着运算符 +- 时,必须在源代码中与运算符之间用空格或括号隔开

int x = 0xE+2;   // error
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);
    // 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 整数常量

[编辑] 另请参阅

C++ 文档 用于 整数字面量