整数字面值
long long 功能部件
有两个
long long 功能部件:- C99
long long功能部件 - non-C99
long long功能部件
注: 对于两个
long long 功能部件,整数文字的语法相同。pre-C99 和 pre-C++11 方式 中支持的整数字面值的类型
下表列出了整数字面值,并在未启用 C99
long long 功能时显示可能的数据类型。| 表示 | 后缀 | 可能的数据类型 | |||||
|---|---|---|---|---|---|---|---|
| 整数 | unsigned int | 长整型 | 无符号 long int | ![]() |
![]() |
||
| 十进制 | 无 | + | + | +2 | |||
| 八进制,十六进制 | 无 | + | + | + | + | ||
| 全部 | u 或 U |
+ | + | ||||
| 十进制 | l 或 L |
+ | + | ||||
| 八进制,十六进制 | l 或 L |
+ | + | ||||
| 全部 | u 或 U 以及 l 或 L |
+ | |||||
| 十进制 | ll 或 LL |
+ | + | ||||
| 八进制,十六进制 | ll 或 LL |
+ | + | ||||
| 全部 | u 或 U 以及 ll 或 LL |
+ | |||||
注意:
|
|||||||
C99 和 C++11 中支持的整数文字的类型
以下示例演示了当您启用不同的
long long 行为时编译器的不同行为:#include <stdio.h>
int main(){
if(0>3999999999-4000000000){
printf("C99 long long");
}
else{
printf("non-C99 IBM long long extension");
}
}在此示例中,值 3999999999 和 4000000000 过大,无法适应 32 位 long
int 类型,但它们可以适应 unsigned long 或 long long int 类型。 如果启用 C99 long long 功能,那么这两个值具有 long long int 类型,因此 3999999999 和 4000000000 的差异为负数。 否则,如果启用 non-C99 IBM long long 扩展,那么这两个值具有 unsigned long 类型,因此差异为正数。禁用 C99 和 non-C99
long long 功能时,具有下列其中一个后缀的整数文字会导致严重的编译时错误:ll或LLu或U以及ll或LL
为了严格遵守 C++11 标准,编译器引入了扩展的整数安全行为,以确保有符号值在提升后不会变成无符号值。 启用此行为后,如果没有包含 u 或 U 的后缀的十进制整数字面值无法由 long long int 类型表示,那么编译器将发出 错误 消息以指示字面值超出范围。 扩展整数安全行为是 C99 long long 功能与相关 IBM 扩展和 C99 long long 功能之间的唯一区别。
下表列出了启用 C99
long long 功能部件时的整数字面值并显示可能的数据类型。
十进制整数文字
十进制整数文字 包含任何数字 0 到 9。 第一个数字不能是 0。 以数字 0 开头的整数文字解释为八进制整数文字,而不是十进制整数文字。
请参阅以下 十进制文字示例:
485976
5
加号 (+) 或减号 (-) 可以在十进制整数文字之前。 运算符被视为一元运算符,而不是字面值的一部分。 请考虑以下示例:
-433132211
+20十六进制整数文字
十六进制整数文字 以 0 数字开头,后跟 x 或 X ,后跟数字 0 到 9 和字母 a 到 f 或 A 到 F 的任意组合。 字母 A (或 a) 到 F (或 f) 分别表示值 10 到 15。
请参阅以下 十六进制整数文字示例:
0x3b24
0XF96
0x21
0x3AA
0X29b
0X4bD
八进制整数文字
八进制整数文字 以数字 0 开头,并包含任何数字 0 到 7。
请参阅以下 八进制整数文字示例:
0
0125
034673
03245

