整型数值在C语言中表示整数,包含正数、零和负数,比如正数100,0和负数-100,数学中整数的范围可以无穷大或无穷小,但C语言所提供的内置整型数值范围是受限制的,C语言对整数范围的设定是通过修饰符来实现,默认情况下,int整型数值表示一个有符号类型的数值,即它可以是负数、0或者是正数。如果我们通过添加特定的修饰符,那么就可以调整这个整型变量的数值范围。由于C语言并没有限定整型类型为特定大小(下文会介绍变量大小的概念),这个特性与编译器或程序所运行的操作系统有关,我们将以64位Windows平台下微软的C编译器为例进行介绍整型数值的支持范围。

在介绍整型数值的范围之前,我们先学习一个新的操作符---sizeof,这个操作符可以计算一个变量或类型(不仅仅是整型变量,其它的变量也是可以的)的大小,变量大小的概念准确地说应该是这个变量在内存中所占据的空间大小,以字节为单位进行衡量。sizeof操作符支持两种类型的参数:一种是直接传入变量的名称,另一种是传入一个类型标识。二者的用法有所不同,如果是变量类型,可以采用如下代码获取这个变量的大小

sizeof(variableName);

sizeof variableName;

但是,如果sizeof的操作数是一个类型标识,比如int,那么,获取这个类型大小的方法为

sizeof (int);下面通过代码演示sizeof操作符的用法

c语言中整型数据的范围(C初级.整型数值)(1)

图1

图1代码中第6行代码定义了一个int整型变量value,第8行代码通过sizeof获取变量value的大小(不是value存储的数值),sizeof对于变量操作数是不需要括号的;第9行代码通过sizeof获取int类型所占据内存空间大小,这种情况下sizeof必须使用括号进行处理,否则编译器会给出语法错误提示。

代码第8行和第9行printf函数的第一个参数使用了一个新的转换符%llu,这个转换符的含义是:输出unsigned long long类型的数值。sizeof操作符的求值结果正是unsigned long long(严格地说,sizeof求值的类型为size_t,它是unsinged long long的一个别名而已)。这两行代码程序输出两个值都为4,表示int类型在内存中占据的空间大小为4个字节。

上文提到可以通过修饰符实现数值范围的调整,C语言对于整型数值提供的修饰符包括:short,long,unsigned,signed等,接下来我们演示下各个修饰符对变量空间占用的影响。对于short和long修饰符,C语言遵循如下规则:short int类型占用的空间大小不超过int,int类型占用的空间大小不超过long int。使用如下代码演示short和long对整型数值范围的影响

c语言中整型数据的范围(C初级.整型数值)(2)

图2

代码第14行输出为2,第15行输出为4,表示short类型的变量和long类型的变量分别在内存中占据2个字节和4个字节,与无修饰符相比,sizeof(short)小于sizeof(int),sizeof(long)大于等于sizeof(int),通常short int和long int整型类型的变量类型可以简写为short和long。

整型变量在内存中占据的空间大小确定之后,它所能够表示的整数个数也就确定了,但其表示的整数范围与是否支持符号(正或负)而不同,比如有符号的整型变量所表示的最大数与无符号的整型变量表示的最大数值是不同的。

c语言中整型数据的范围(C初级.整型数值)(3)

图3

图3代码中使用了limits.h标准库中的宏定义SHRT_MIN,SHRT_MAX和USHRT_MAX,因此在代码中需要加入#include <limits.h>代码。对于有符号变量,最小值为负值2的15次方,最大值为正数2的15次方减1,分别对应SHRT_MIN和SHRT_MAX;对于无符号变量,最小值为0,最大值为2的16次方减1,对应USHRT_MAX。按照同样的方法,可以显示出int、unsigned int、long int、unsigned long int的最大值和最小值。表1列出了64位Windows平台环境下使用微软C编译器构建的程序各个整型类型的最大值和最小值。

类型

最大值

最小值

short int

32767

-32768

unsigned short int

65535

0

int

2147483647

-2147483648

unsigned int

4294967295

0

long int

2147483647

-2147483648

unsigned long int

4294967295

0

表1

对于有符号整数和无符号整数,printf和scanf采用了不同的转换符,有符号整数使用转换符%d,而无符号整数则采用的是%u转换符,在进行整数输出或输入时,转换符与其对应的整型变量类型一定要保持一致,否则会出现错误的结果。再通过下面的代码展示二者的用法。

c语言中整型数据的范围(C初级.整型数值)(4)

图4

代码第29行输出的内容为无符号整数,printf使用了转换符%u,第32行代码则使用了%d,输出有符号整数。第31行通过signed修饰符显式地指明income是一个有符号int类型的变量,而第33行代码,则省略了signed修饰符,默认情况下,如果int不指定符号修饰符,那么就认为是一个有符号整数,通常我们可以省略这个signed修饰符。

至此,C语言中的整型类型的数值我们已经做了详细的介绍,用户可以根据实际数值的范围选择不同的修饰符进行类型设定。在对于资源空间占用比较严格且满足需求的前提下,可以选择类型大小较小的类型,以减少不必要的空间浪费;如果没有特殊要求,使用int类型的整型数值即可;对于需要表示较大的数值时,可以选择long int的整型数值。

,