====== 整型常量(Integer constant) ======
整型常量的表现形式有十进制(Decimal)、八进制(Octal)和十六进制(Hexadecimal)。十六进制以0x或0X开头,八进制以0开头,其余为十进制形式。
整型常量可以接后缀,字母l或L表示long型,字母u或U表示无符号(unsigned)整数,C99增加了long long类型,相应的,ll或LL表示long long型。u/U和l/L、u/U和ll/LL可以同时出现,顺序无所谓。
由于小写字母l和数字1很容易混淆,所以建议统一使用大写的L。
整型常量的值总是为正数(在没有发生溢出时),即使常量前面有负号(-),也作为一元操作符对待,而不作为常量的一部分。
整型常量的具体类型依赖于诸多因素,而且在Tradtional C、C89、C99中的处理方式都不同。具体规则如下表所示(**同组中以从上到下的顺序选择第一个不会溢出的类型**):
|< 100% 25% 25% 25% 25% >|
^ 常量 ^ Traditional C ^ C89 ^ C99 ^
|//dd...d// |int |int |int |
|::: |long |long |long |
|::: | |unsigned long |long long |
|0//dd...d//\\ 0X//dd...d// |unsigned |int |int |
|::: |long |unsigned |unsigned |
|::: | |long |long |
|::: | |unsigned long |unsigned long |
|::: | | |long long |
|::: | | |unsigned long long |
|//dd...d//U\\ 0//dd...d//U\\ 0X//dd...d//U | |unsigned |unsigned |
|::: | |unsigned long |unsigned long |
|::: | | |unsigned long long |
|//dd...d//L |long |long |long |
|::: | |unsigned long |long long |
|0//dd...d//L\\ 0X//dd...d//L |long |long |long |
|::: | |unsigned long |unsigned long |
|::: | | |long long |
|::: | | |unsigned long long |
|//dd...d//UL\\ 0//dd...d//UL\\ 0X//dd...d//UL | |unsigned long |unsigned long |
|::: | | |unsigned long long |
|//dd...d//LL | | |long long |
|0//dd...d//LL\\ 0X//dd...d//LL | | |long long |
|::: | | |unsigned long long |
|//dd...d//ULL\\ 0//dd...d//ULL\\ 0X//dd...d//ULL | | |unsigned long long |
如果常量的值超过了组内最大类型可表示的值,则结果是未定义(undefined)的。C99允许实现在保持符号性的前提下,可以选择一个扩展的类型(如果存在的话)。
需要注意0开头的是八进制而不是十进制数的情况。有时为了对齐格式,可能无意间将十进制数写成了八进制数,如:
struct {
int part_number;
char *description;
} parttab[] = {
046, "left-handed widget",
047, "right-handed widget",
...
125, "framins"
};
{{tag>C语言}}