易百教程

数据类型限制(大小)

limits.h头文件定义表示每种类型的限制值符号。下表显示了与每个有符号整数类型的限制对应的符号名称。

类型 最小值 最大值
char CHAR_MIN CHAR_MAX
short SHRT_MIN SHRT_MAX
int INT_MIN INT_MAX
long LONG_MIN LONG_MAX
long long LLONG_MIN LLONG_MAX

无符号整数类型的下限均为0,因此是无符号。对应于无符号整数类型的上限有符号是:UCHAR_MAXUSHRT_MAXUINT_MAXULONG_MAXULLONG_MAX
要使用这些符号中的任何一个,必须在源文件中使用#include指令包含limits.h头文件:

#include <limits.h>

可以使用int类型的最大值初始化变量,如下所示:

int number = INT_MAX;

float.h头文件定义了浮点值的符号。定义三个浮点类型表示的最大和最小正值的符号,如下表所示。

类型 下限(最小)值 上限(最大)值
float FLT_MIN FLT_MAX
double DBL_MIN DBL_MAX
long double LDBL_MIN LDBL_MAX

以下程序输出与头文件中定义的符号对应的值,它将打印显示编译器的限制值。

示例代码

#include <stdio.h>                          // For command line input and output
#include <limits.h>                         // For limits on integer types
#include <float.h>                          // For limits on floating-point types

int main(void)
{
      printf("char类型的变量存储值范围是: %d 至 %d\n", CHAR_MIN, CHAR_MAX);
      printf("无符号char类型的变量存储值范围是: 0 至 %u\n", UCHAR_MAX);
      printf("short类型的变量存储值范围是: %d 至 %d\n", SHRT_MIN, SHRT_MAX);
      printf("无符号short类型的变量存储值范围是: 0 至 %u\n", USHRT_MAX);
      printf("int类型的变量存储值范围是: %d 至 %d\n", INT_MIN,  INT_MAX);
      printf("无符号int类型的变量存储值范围是: 0 至 %u\n", UINT_MAX);
      printf("long类型的变量存储值范围是: %ld 至 %ld\n", LONG_MIN, LONG_MAX);
      printf("无符号long类型的变量存储值范围是: 0 至 %lu\n", ULONG_MAX);
      printf("long long类型的变量存储值范围是: %lld 至 %lld\n", LLONG_MIN, LLONG_MAX);
      printf("无符号long long类型的变量存储值范围是: 0 至 %llu\n", ULLONG_MAX);
      printf("//*************************************************************//\n");
      printf("float类型的最小正非零值是: %.3e\n", FLT_MIN);
      printf("float类型的最大值是: %.3e\n", FLT_MAX);
      printf("double类型的最小非零值是: %.3e\n", DBL_MIN);
      printf("double类型的最大值是: %.3e\n", DBL_MAX);
      printf("long double类型的最小非零值是: %.3Le\n", LDBL_MIN);
      printf("long double类型的最大值是: %.3Le\n",  LDBL_MAX);
      printf("//*************************************************************//\n");
      printf("float类型的变量提供 %u 十进制数字精度。\n", FLT_DIG);
      printf("double类型的变量提供 %u 十进制数字精度。\n", DBL_DIG);
      printf("long double类型的变量提供 %u 十进制数字精度。\n", LDBL_DIG);
      return 0;
}

执行上面示例代码,得到以下结果:

hema@ubuntu:~/book$ gcc -o main main.c
hema@ubuntu:~/book$ ./main
char类型的变量存储值范围是: -128 至 127
无符号char类型的变量存储值范围是: 0 至 255
short类型的变量存储值范围是: -32768 至 32767
无符号short类型的变量存储值范围是: 0 至 65535
int类型的变量存储值范围是: -2147483648 至 2147483647
无符号int类型的变量存储值范围是: 0 至 4294967295
long类型的变量存储值范围是: -9223372036854775808 至 9223372036854775807
无符号long类型的变量存储值范围是: 0 至 18446744073709551615
long long类型的变量存储值范围是: -9223372036854775808 至 9223372036854775807
无符号long long类型的变量存储值范围是: 0 至 18446744073709551615
//*************************************************************//
float类型的最小正非零值是: 1.175e-38
float类型的最大值是: 3.403e+38
double类型的最小非零值是: 2.225e-308
double类型的最大值是: 1.798e+308
long double类型的最小非零值是: 3.362e-4932
long double类型的最大值是: 1.190e+4932
//*************************************************************//
float类型的变量提供 6 十进制数字精度。
double类型的变量提供 15 十进制数字精度。
long double类型的变量提供 18 十进制数字精度。

上面程序怎么运行?

在一系列printf()函数调用中输出limits.hfloat.h头文件中定义的符号值。

  • %u说明符输出无符号整数值。
  • %e说明符用于浮点限制,它以指数形式显示值。

上面代码中只指定三位数的精度,因为不需要输出中的完全精确度。
printf()函数显示long double类型的值时,需要指定L修饰符。%f说明符表示没有指数的值。