程序设计与问题求解:C语言
上QQ阅读APP看书,第一时间看更新

2.4.1 整型变量

1. 整型变量的分类

整型变量可分为基本整型(int)、短整型(short int)、长整型(long int)、双长整型(long long int)和无符号型(unsigned)。

(1)基本整型

类型声明符为int,在内存中占2字节或4字节。C语言标准没有规定各种类型数据所占用存储空间的长度,其长度是由编译系统自行决定的。

(2)短整型

类型声明符为short int或short,在内存中占2字节。

(3)长整型

类型声明符为long int或long,在内存中占4字节。

(4)双长整型

类型声明符为long long int或者long long,在内存中一般分配8字节。C语言标准虽然没具体规定各种类型数据占用存储单元的长度,但是要求long型数据长度不短于int型,int型不短于short型,即:sizeof(short)≤sizeof(int)≤sizeof(long)≤sizeof(long long)。

sizeof是测算类型或变量长度的运算符。在Turbo C 2.0中,short型和int型数据都为2个字节16位,long型数据为4字节32位;在Dev-C++和Visual C++ 6.0中,short型数据为2个字节16位,int型和long型数据为4字节32位。

目前大多数编译系统把short型数据定为2字节16位,int型数据为4字节32位,long型数据为4字节32位,long long型数据为8字节64位。

(5)无符号型

类型声明符为unsigned,存储单元中全部二进位(bit)都用作存放数本身,而不包括符号。无符号型又可与前面的4种类型匹配而构成另外几种类型。

① 无符号短整型:类型声明符为unsigned short。

② 无符号基本整型:类型声明符为unsigned int。

③ 无符号长整型:类型声明符为unsigned long。

④ 无符号双长整型:类型声明符为unsigned long long。

有符号数据存储单元中最高位代表符号位,0为正,1为负。各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。由于省去了符号位,故不能表示负数,但可存放的正数范围比一般整型变量中正数的范围扩大一倍。定义a和b两个变量:

short a;
unsigned short b;

如果用2字节存放一个short型整数,则变量a的数值范围是-32768~32767,变量b的数值范围是0~65535,如图2.3所示。

图2.3 整型变量的最大值

表2.1列出了各种整型变量所分配的内存字节数及取值范围。

表2.1 整型变量的字节数及取值范围

注:方括号表示其中的内容是可选的,既可以写,也可以不写。只有整型和字符型数据可以加unsigned修饰符,实型数据则不能加。

2. 整型变量的定义

C语言规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。

变量定义的一般形式如下:

类型声明符  变量名标识符1, 变量名标识符2, …;

例如:

int a, b, c;               /* a 、b 、c 为整型变量*/
long m, n;                 /* m、n 为长整型变量*/
unsigned int p, q;         /* p 、q 为无符号整型变量*/

定义变量时应注意以下几点。

(1)允许在一个类型声明符后定义多个相同类型的变量,各变量名之间用逗号间隔。类型声明符与变量名之间至少用一个空格间隔。

(2)最后一个变量名之后必须以分号结束。

(3)变量定义必须放在变量使用之前。

(4)可在定义变量的同时给出变量的初值。其格式为:

类型声明符  变量名标识符1 =初值1, 变量名标识符2 =初值2, …;

例2.4 整型变量的定义与初始化。

程序代码如下:

#include <stdio.h>
int main() {
    int a=3, b=5;
    printf("a+b=%d\n", a+b);
return 0;
}
3. 变量在内存中的存储形式

数据在内存中是以二进制形式存放的。如图2.4所示,定义了一个短整型变量i:short int i=10;,十进制数10的二进制形式为1010,如果每个整型变量在内存中占两字节,则图2.4(a)是数据存放的示意图,图2.4(b)是数据在内存中实际存放的情况。

图2.4 数据存放情况

数值是以补码的形式存放的。正数的补码与其原码的形式相同;负数的补码是将该数绝对值的二进制形式按位取反并在末尾加1。如-10的补码:①取-10的绝对值10;②10的二进制形式为00000000 00001010(一个整数占16位);③按位取反得11111111 11110101;④末尾加1得11111111 11110110,如图2.5所示。

图2.5 -10的补码

最左边的一位是符号位,0表示正数,1表示负数。

4. 整型数据的溢出

一个short int型变量用两字节存放,那么取值范围是-32768~32767,超过这个范围则溢出。

例2.5 短整型数据的溢出。

程序代码如下:

#include <stdio.h>
int main(){
    short int a,b;
    a=32767;
    b=a+1;
    printf("a=%d,b=%d\n", a , b);
    return 0;
}

说明:

输出结果:a=32767,b=-32768。

32767在内存中的存放形式是01111111 11111111,加1后变为10000000 00000000,而它是-32768的补码形式,所以变量b的值是-32768。一个短整型变量只能容纳-32768~32767范围内的数,超过这个范围则溢出,但运行时系统并不给出“错误信息”,程序员要靠细心和经验来保证结果的正确。

溢出操作的输出结果可以这样计算:将该数减去该数据类型的模,模是该数据类型所能表示数的个数,短整型数据类型的模是65536。例如:

short int i = 65535;
printf("%d\n", i);

输出结果为-1,因为65535-65536=-1。