数据类型

在C语言中,所有的变量都需要进行数据类型定义。一旦变量定义了数据类型,所有有关变量行为的信息都确定了。如果你知道变量的数据类型,则可以知道此变量的详细信息,如性质,限制,大小等。

例如:

signed short int input1;

由以上数据类型定义,我们可以知道变量input1是一个:

  1. 整数类型变量
  2. 可以进行' + - * % /'操作
  3. 大小范围在-32768到+32767之间,你可以对input1进行预测,因为它的数据类型为short int。

如何确定数据变量的类型

假设您正在编写一个用于两个数字加法的程序。要编写此程序,您必须清楚用户的输入行为,例如:

  • 输入数据的类型,即整数,十进制,正数,负数
  • 输入数据的范围

假设我是用户,我将输入

  1. 仅整数值
  2. 正值和负值都有可能
  3. 输入数据在-32,000至+32,000之间

因此,作为一名程序员,我将在32位平台上声明以下变量:

  1. input1和input2 --> 用于存储用户输入的值;
  2. result --> 用于存储运算结果;
signed short int input1;  /*memory size=2 byte ,data limit=-32768 to +32767*/
signed short int input2;  /*memory size=2 byte ,data limit=-32768 to +32767*/
signed int result;  /*memory size=4 byte ,data limit=-2147483648 to +2147483647*/

注意:
result的数据类型被定义为int,是为了满足当用户输入带符号的short int的极限值时,能够获得正确值得需求。例如:
当 input1 = 20000,input2 = 20000 时,
result = 40000 。40000超出short int范围。
因此,result使用int类型进行定义。

数据类型分类

数据类型主要分为三类:

  1. 基本数据类型
  2. 派生数据类型
  3. 用户定义的数据类型

数据类型树如下所示:
数据类型

下表是关于基础数据类型的详细信息。

Types Size Range[32位平台] 格式限定符
char 1 byte -128 ~ 127 %c
signed char 1 byte -128 ~ 127 %c
char 1 byte 0 ~ 255 %c
short int 2 byte -32768 ~ 32768 %d
signed short int 2 byte -32768 ~ 32768 %d
unsigned short int 2 byte 0 ~ 65535 %u
int 4 byte -2147483648 ~ 2147483647 %d
signed int 4 byte -2147483648 ~ 2147483647 %d
unsigned int 4 byte 0 ~ 4294967295 %u
long int 8 byte -9223372036854775808 ~
9223372036854775807
%ld
signed long int 8 byte -9223372036854775808 ~
9223372036854775807
%ld
unsigned long int 8 byte 0 ~ 18446744073709551615 %lu
float 4 byte 1.175494e-38 ~ 3.402823e+38 %f 或 %e
double 8 byte 2.225074e-308 ~ 1.797693e+308 %lf 或 %le
long double 16 byte 3.362103e-4932 ~ 1.189731e+4932 %Lf 或 %Le
void 0

编程练习

编写程序以按所有数据类型打印大小和可接受的数据范围。

查找范围和大小的程序:

在下面的程序中,通过limits.h头文件中定义了一些宏,能够获取数据类型的大小。

#include <stdio.h>
#include <limits.h>
 
 /*UCHAR_MIN 并不未在limits.h中定义,因为正数最小值始终为0,此处自行定义。*/
#define UCHAR_MIN  0 
#define UINT_MIN   0 
#define USHRT_MIN  0 
#define ULONG_MIN   0
 
int main(void)
{
     /*********************size of Char***************************************/
    printf("Size of char =  %lu byte\n",sizeof(char));
    printf("Size of signed char = %lu byte\n",sizeof(signed char));
    printf("range of unsigned char = %lu byte\n\n",sizeof(unsigned char));
 
    /********************Char RANGE***********************************************/
    printf("range of char =  %d to %d\n",CHAR_MIN,CHAR_MAX);
    printf("range of signed char = %d to %d\n",SCHAR_MIN,SCHAR_MAX);
    printf("range of unsigned char = %u to %u\n\n",UCHAR_MIN,UCHAR_MAX);
         
     /********************size of int************************************/
    printf("Size of int=  %lu byte\n",sizeof(int));
    printf("Size of signed int= %lu byte\n",sizeof(signed int));
    printf("range of unsigned int= %lu byte\n\n",sizeof(unsigned int));
 
    /********************RANGE of int*****************************************/
    printf("range of int=  %d to %d\n",INT_MIN,INT_MAX);
    printf("range of signed int= %d to %d\n",INT_MIN,INT_MAX);
    printf("range of unsigned int= %u to %u\n\n",UINT_MIN,UINT_MAX);
 
     /********************size of short int*************************/
      printf("Size of short int=  %lu byte\n",sizeof(short int));
      printf("Size of signed short int= %lu byte\n",sizeof(signed short int));
      printf("range of unsigned short int= %lu byte\n\n",sizeof(unsigned short int));
 
    /********************RANGE of short int************************************/
    printf("range of short int=  %d to %d\n",SHRT_MIN,SHRT_MAX);
    printf("range of signed short int= %d to %d\n",SHRT_MIN,SHRT_MAX);
    printf("range of unsigned short int= %u to %u\n\n",USHRT_MIN,USHRT_MAX);
 
     /********************size of long int*************************************/
     printf("Size of long int=  %lu byte\n",sizeof(long int));
     printf("Size of signed long int= %lu byte\n",sizeof(signed long int));
     printf("range of unsigned long int= %lu byte\n\n",sizeof(unsigned long int));
 
    /********************RANGE of long int**************************************/
     printf("range of long int=  %ld to %ld\n",LONG_MIN,LONG_MAX);
     printf("range of signed long int= %ld to %ld\n",LONG_MIN,LONG_MAX);
     printf("range of unsigned long int= %lu to %lu\n\n",ULONG_MIN,ULONG_MAX);
}

输出结果:
output-1

查找浮点数,双精度数据类型的范围,大小和精度:

代码如下:

#include <stdio.h>
#include <float.h>

int main(void)
{
    /*********************float**************************************/
    printf("Size of float =  %lu byte\n",sizeof(float));
    printf("float类型数据精确到小数点后 %lu 位。 \n",FLT_DIG);
    printf("range of float = %e to %e\n\n",FLT_MIN,FLT_MAX);

    /*********************double**************************************/
    printf("Size of double =  %lu byte\n",sizeof(double));
    printf("double类型数据精确到小数点后 %lu 位。 \n",DBL_DIG);
    printf("range of double = %le to %le\n\n",DBL_MIN,DBL_MAX);

    /*********************long double************************/
    printf("Size of long double=  %lu byte\n",sizeof(long double));
    printf("long double类型数据精确到小数点后 %lu 位。 \n",LDBL_DIG);
    printf("range of long double= %Le to %Le\n\n",LDBL_MIN,LDBL_MAX);

    return 0;
}

输出结果:
output2-1

下一节