integer constant
整数常量
允许直接在表达式中使用整数类型的值。
句法
整型常量是表单的非左值表达式。
decimal-constant integer-suffix(optional) | (1) | |
---|---|---|
octal-constant integer-suffix(optional) | (2) | |
hex-constant integer-suffix(optional) | (3) | |
其中
- 十进制常数是一个非零十进制数(
1
,2
,3
,4
,5
,6
,7
,8
,9
),随后的零个或多个十进制数字(0
,1
,2
,3
,4
,5
,6
,7
,8
,9
)
说明
1)十进制整数常量(以10为底,第一位数字最重要)。
2)八进制整数常量(基数8,第一位数字最重要)。
3)十六进制整数常量(基数16,第一个数字是最重要的,字母'a'到'f'代表十进制值10到15)。
以下变量初始化为相同的值:
int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
整型常量的类型
整数常量的类型是该值可以匹配的第一个类型,它取决于使用哪个数字库和哪个整数后缀的类型列表。
| 整数常量允许的类型|
|:----|
| suffix | decimal bases | hexadecimal or octal bases |
| no suffix | int long int unsigned long int (until C99) long long int (since C99). | int unsigned int long int unsigned long int long long int(since C99) unsigned long long int(since C99). |
| u or U | unsigned int unsigned long int unsigned long long int(since C99). | unsigned int unsigned long int unsigned long long int(since C99). |
| l or L | long int unsigned long int(until C99) long long int(since C99). | long int unsigned long int long long int(since C99) unsigned long long int(since C99). |
| both l/L and u/U | unsigned long int unsigned long long int(since C99). | unsigned long int unsigned long long int(since C99). |
| ll or LL | long long int(since C99) | long long int(since C99) unsigned long long int(since C99). |
| both ll/LL and u/U | unsigned long long int(since C99) | unsigned long long int(since C99) |
如果整数常量的值太大而不适合后缀/基数组合所允许的任何类型,并且编译器支持扩展整数类型(如__int128
),则该常量可以是扩展整数类型; 否则,该计划是不合格的。
笔记
在整数常量字母是不区分大小写的:0xDeAdBaBeU
与0XdeadBABEu
表示相同的数目(一个例外是长长后缀,其是ll
或LL
,从未lL
或Ll
)。
没有负整数常量。诸如-1
将一元减号运算符应用于由常量表示的值的表达式可能涉及隐式类型转换。
当在#if或#elif的控制表达式中使用时,所有有符号整型常量的作用就好像它们具有类型,intmax_t
并且所有无符号整型常数的作用就好像它们具有类型一样uintmax_t
。
整型常量可以用在整型常量表达式中。
例
#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 unsigned long long even without a long long suffix
printf("12345678901234567890u = %llu\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", -9223372036854775808u
// unary minus applied to unsigned value subtracts it from 2^64,
// this gives 9223372036854775808
printf("%lld\n", -9223372036854775807 - 1
// // correct way to represent the value -9223372036854775808
}
输出:
123 = 123
0123 = 83
0x123 = 291
12345678901234567890ull = 12345678901234567890
12345678901234567890u = 12345678901234567890
9223372036854775808
-9223372036854775808
参考
- C11 standard (ISO/IEC 9899:2011):