整数常量

来自cppreference.com
< c‎ | language

允许整数类型的值直接用于表达式。

语法

整数常量是拥有下列类型的非左值表达式

decimal-constant integer-suffix(可选) (1)
octal-constant integer-suffix(可选) (2)
hex-constant integer-suffix(可选) (3)

其中

  • decimal-constant 是非零十进制数位( 123456789 ),跟随零个或更多十进制数字( 0123456789
  • octal-constant 是数字零( 0 )跟随零个或更多八进制数位( 01234567
  • hex-constant 是字符序列 0x 或字符序列 0X 跟随一个或更多十六进制数位( 0123456789aAbBcCdDeEfF
  • integer-suffix ,若提供则可包含下面一或两者,可以任何顺序出现:
  • unsigned-suffix (字符 u 或字符 U
  • long-suffix (字符 l 或字符 L long-long-suffix (字符序列 llLL (C99 起)

解释

1) 十进制整数常量(底 10 ,首位数为最高位)。
2) 八进制整数常量(底 8 ,首位数为最高位)。
3) 十六进制整数常量(底 16 ,首位数为最高位,字母 'a' 到 'f' 表示十进制值 10 到 15 )。

下列对象被初始化为相同值:

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;

整数常量的类型

整数常量类型是从依赖数字底和所用 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 起)

若整数常量过大从而无法符合后缀/底结合所允许的任何类型,且编译器支持扩展整数类型(譬如 __int128 ),则常量可能以扩展整数类型给出;否则程序为病式。

注意

整数常量中的字母无关大小写: 0xDeAdBaBeU0XdeadBABEu 表示同一个数(一个例外是 long-long-suffix ,必须是 llLL ,不能是 lLLl )。

没有负整数常量。如 -1 的表达式是将一元负运算符应用到常量所表示的值,可能会引起隐式类型转换

当用于#if#elif的控制表达式时,所有有符号整数常量都表现为如同拥有 intmax_t 类型,且所有无符号整数常量都表现为如同有 uintmax_t 类型。

整数常量可用于整数常量表达式

由于最大吞噬规则,以 eE 结束的十六进制整数常量在后随运算符 +- 时,源码中必须以空白符或括号将它们与运算符分隔:

int x = 0xE+2;   // 错误
int y = 0xa+2;   // OK
int z = 0xE +2;  // OK
int q = (0xE)+2; // OK

否则形成一个非法的预处理数字记号,这会进一步导致分析失败。

示例

#include <stdio.h>
#include <inttypes.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", -9223372036854775807ull - 1);
    // 组成有符号值 -9223372036854775808 的正确方式
}

输出:

123 = 123
0123 = 83
0x123 = 291
12345678901234567890ull = 12345678901234567890
12345678901234567890u = 12345678901234567890
9223372036854775808
-9223372036854775808

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 6.4.4.1 Integer constants (p: 62-64)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.4.4.1 Integer constants (p: 54-56)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 3.1.3.2 Integer constants

参阅