命名空间
变体
操作

整型常量

来自 cppreference.cn
< c‎ | 语言

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

目录

[编辑] 语法

整型常量是以下形式的非左值表达式:

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-suffix(字符 u 或字符 U
  • long-suffix(字符 l 或字符 Llong-long-suffix(字符序列 ll 或字符序列 LL(C99 起)
  • bit-precise-int-suffix(字符序列 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

[编辑] 整型常量的类型

整型常量的类型是根据所使用的数字基数和 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 起)

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 代表相同的数字(一个例外是 long-long-suffix,它是 llLL,从不为 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++ 文档,关于 整型字面量