整数字面量

来自cppreference.com
< cpp‎ | language
 
 
 
表达式
概述
值类别(左值 lvalue、右值 rvalue、亡值 xvalue)
求值顺序(序列点)
常量表达式
不求值表达式
初等表达式
lambda 表达式(C++11)
字面量
整数字面量
浮点字面量
布尔字面量
字符字面量,包含转义序列
字符串字面量
空指针字面量(C++11)
用户定义字面量(C++11)
运算符
赋值运算符a=ba+=ba-=ba*=ba/=ba%=ba&=ba|=ba^=ba<<=ba>>=b
自增与自减++a--aa++a--
算术运算符+a-aa+ba-ba*ba/ba%b~aa&ba|ba^ba<<ba>>b
逻辑运算符a||ba&&b!a
比较运算符a==ba!=ba<ba>ba<=ba>=b
成员访问运算符a[b]*a&aa->ba.ba->*ba.*b
其他运算符a(...)a,ba?b:c
运算符的替代表示形式
优先级和结合性
折叠表达式(C++17)
new 表达式
delete 表达式
throw 表达式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
运算符重载
类型转换
隐式转换
const_cast
static_cast
reinterpret_cast
dynamic_cast
显式转换 (T)aT(a)
用户定义转换
 

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

目录

[编辑] 语法

整数字面量是下列形式的初等表达式

decimal-literal integer-suffix(可选) (1)
octal-literal integer-suffix(可选) (2)
hex-literal integer-suffix(可选) (3)
binary-literal integer-suffix(可选) (4) (C++14 起)

其中

  • decimal-literal 是非零十进制位(123456789 )后随零或多个十进制位( 0123456789
  • octal-literal 是数位零( 0 )后随零或多个八进制位( 012345678
  • hex-literal 是字符序列 0x 或字符序列 0X 后随一或多个十六进制数位( 0123456789aAbBcCdDeEfF
  • binary-literal 是字符序列 0b 或字符序列 0B 后随一或多个二进制位( 01
  • 若提供 integer-suffix ,则可含有下列一或两者(若均提供,则可以任意顺序出现):
  • unsigned-suffix (字符 u 或字符 U
  • long-suffix (字符 l 或字符 Llong-long-suffix (字符序列 ll 或字符序列 LL (C++11 起)
数位间可插入作为分隔符的可选的单引号( ' )。它们为编译器所忽略。 (C++14 起)

[编辑] 解释

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; // C++14

下列变量亦被初始化到相同值:

unsigned long long l1 = 18446744073709550592ull; // C++11
unsigned long long l2 = 18'446'744'073'709'550'592llu; // C++14
unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C++14
unsigned long long l4 = 184467'440737'0'95505'92LLU; // C++14

[编辑] 字面量的类型

整数字面量的类型,是依赖于所用数字基底和 integer-suffix 的列表中,能适合其值的首个类型。

对整数字面量允许的类型
后缀 十进制底 十六进制或八进制底
无后缀 int

long int
long long int(C++11 起)

int

unsigned int
long int
unsigned long int
long long int(C++11 起)
unsigned long long int(C++11 起)

uU unsigned int

unsigned long int
unsigned long long int(C++11 起)

unsigned int

unsigned long int
unsigned long long int(C++11 起)

lL long int

unsigned long int(C++11 前)
long long int(C++11 起)

long int

unsigned long int
long long int(C++11 起)
unsigned long long int(C++11 起)

l/Lu/U unsigned long int

unsigned long long int(C++11 起)

unsigned long int(C++11 起)

unsigned long long int(C++11 起)

llLL long long int(C++11 起) long long int(C++11 起)

unsigned long long int(C++11 起)

ll/LLu/U unsigned long long int(C++11 起) unsigned long long int(C++11 起)

若整数字面量的值过大,而无法符合任何后缀/底组合所允许的类型,且编译器支持扩展整数类型(例如 __int128 ),则字面量可以被授予扩展整数类型——否则程序为病态。

[编辑] 注意

整数字面量中的字母是无关大小写的: 0xDeAdBaBeU0XdeadBABEu 表示同一数值(一个例外是 long-long-suffix ,它是 llLL ,而决不能是 lLLl

没有负整数字面量。如 -1 的表达式应用一元减运算符到字面量所表示的值,这可能涉及隐式转换。

在早于 C99 的 C 中(但不是 C++ 中),不符合 long int 的无后缀十进制值允许拥有类型 unsigned long int

用于 #if#elif 的控制表达式时,全部有符号整数常量表现如同它们拥有 std::intmax_t 类型,而全部无符号整数常量表现如同它们拥有 std::uintmax_t 类型

[编辑] 示例

#include <iostream>
 
int main()
{
std::cout << 123    << '\n'
          << 0123   << '\n'
          << 0x123  << '\n'
          << 0b10   << '\n'
          << 12345678901234567890ull << '\n'
          << 12345678901234567890u   << '\n'; // 类型是 unsigned long long
                                              // 即使无 long long 后缀
 
//   std::cout << -9223372036854775808 << '\n'; // 错误:值 9223372036854775808
                // 不吻合 signed long long ,这是无后缀整数字面量允许的最大类型
     std::cout << -9223372036854775808u << '\n'; // 应用于无符号值的一元减
                // 从 2^64 减去该值,给出 9223372036854775808
     std::cout << -9223372036854775807 - 1 << '\n'; // 计算值 -9223372036854775808
                                                    // 的正确方式
}

输出:

123
83
291
2
12345678901234567890
12345678901234567890
9223372036854775808
-9223372036854775808

[编辑] 参阅

整数常量C 文档