09-明示常量
4.3.2 明示常量
C头文件 limits.h 和 float.h 分别提供了与整数类型和浮点类型大小限制相关的详细信息。每个头文件都定义了一系列供实现使用的明示常量[3]。例如, limits.h 头文件包含以下类似的代码:
#define INT_MAX +32767
#define INT_MIN -32768
这些明示常量代表 int 类型可表示的最大值和最小值。如果系统使用 32 位的 int ,该头文件会为这些明示常量提供不同的值。如果在程序中包含 limits.h 头文件,就可编写下面的代码:
printf("Maximum int value on this system = %d\n", INT_MAX);
如果系统使用 4 字节的 int , limits.h 头文件会提供符合 4 字节 int 的 INT_MAX 和 INT_MIN 。表 4.1 列出了 limits.h 中能找到的一些明示常量。
| 明示常量 | 含义 |
| :----- | :----- | :----- | :----- |
| CHAR_BIT | char 类型的位数 |
| CHAR_MAX | char 类型的最大值 |
| CHAR_MIN | char 类型的最小值 |
| SCHAR_MAX | signed char 类型的最大值 |
| SCHAR_MIN | signed char 类型的最小值 |
| UCHAR_MAX | unsigned char 类型的最大值 |
| SHRT_MAX | short 类型的最大值 |
| SHRT_MIN | short 类型的最小值 |
| USHRT_MAX | unsigned short 类型的最大值 |
| INT_MAX | int 类型的最大值 |
| INT_MIN | int 类型的最小值 |
| UINT_MAX | unsigned int 的最大值 |
| LONG_MAX | long 类型的最大值 |
| LONG_MIN | long 类型的最小值 |
| ULONG_MAX | unsigned long 类型的最大值 |
| LLONG_MAX | long long 类型的最大值 |
| LLONG_MIN | long long 类型的最小值 |
| ULLONG_MAX | unsigned long long 类型的最大值 |
类似地, float.h 头文件中也定义一些明示常量,如 FLT_DIG 和 DBL_DIG ,分别表示 float 类型和 double 类型的有效数字位数。表 4.2 列出了 float.h 中的一些明示常量(可以使用文本编辑器打开并查看系统使用的 float.h 头文件)。表中所列都与 float 类型相关。把明示常量名中的 FLT 分别替换成 DBL 和 LDBL ,即可分别表示 double 和 long double 类型对应的明示常量(表中假设系统使用 2 的幂来表示浮点数)。
| 明示常量 | 含义 |
| :----- | :----- | :----- | :----- |
| FLT_MANT_DIG | float 类型的尾数位数 |
| FLT_DIG | float 类型的最少有效数字位数(十进制) |
| FLT_MIN_10_EXP | 带全部有效数字的 float 类型的最小负指数(以 10 为底) |
| FLT_MAX_10_EXP | float 类型的最大正指数(以 10 为底) |
| FLT_MIN | 保留全部精度的 float 类型最小正数 |
| FLT_MAX | float 类型的最大正数 |
| FLT_EPSILON | 1.00 和比 1.00 大的最小 float 类型值之间的差值 |
程序清单 4.5 演示了如何使用 float.h 和 limits.h 中的数据(注意,编译器要完全支持 C99 标准才能识别 LLONG_MIN 标识符)。
程序清单4.5 defines.c 程序
// defines.c -- 使用limit.h和float头文件中定义的明示常量
#include <stdio.h>
#include <limits.h> // 整型限制
#include <float.h> // 浮点型限制
int main(void)
{
printf("Some number limits for this system:\n");
printf("Biggest int: %d\n", INT_MAX);
printf("Smallest long long: %lld\n", LLONG_MIN);
printf("One byte = %d bits on this system.\n", CHAR_BIT);
printf("Largest double: %e\n", DBL_MAX);
printf("Smallest normal float: %e\n", FLT_MIN);
printf("float precision = %d digits\n", FLT_DIG);
printf("float epsilon = %e\n", FLT_EPSILON);
return 0;
}
该程序的输出示例如下:
Some number limits for this system:
Biggest int: 2147483647
Smallest long long: -9223372036854775808
One byte = 8 bits on this system.
Largest double: 1.797693e+308
Smallest normal float: 1.175494e-38
float precision = 6 digits
float epsilon = 1.192093e-07
C预处理器是非常有用的工具,要好好利用它。本书后面的章节中会介绍更多相关应用。