2.3 整型数据

2.3.1 整型常量

整型常量即整型数,在C语言中整型常量有以下三种表示形式。

(1)十进制整数表示形式由数字0~9组成。如123、-45、0等。

(2)八进制整数表示形式由数字 0~7 组成。在书写时要加前缀“0”(零),如 012 表示八进制数12。所以若出现089这样的数,则是错误的。因为出现了8,超出八进制使用的数码。

(3)十六进制整数表示形式由0x或0X开头,其余各位由0~9与字母a~f(0X开头为A~F)组成。在书写时要加前缀“0x”或“0X”。如0x36表示十六进制数36。

2.3.2 整型变量

1.整型数据在内存中的存放形式

数据在内存中以二进制形式存放,例如,定义一个整型变量x。

int x;

x=10;

十进制数 10 的二进制形式为 1010,编译器为它分配两个字节的存储单元(在 Turbo C环境下),如下所示。

在内存中,数据是以补码表示的,其中:

●正数的补码和原码相同;

●负数的补码:将该数的绝对值的二进制形式按位取反再加1。

例如,求-10的补码。

(1)求10的原码

(2)取反

(3)再加1,得-10的补码

由此可知,在存放整数的存储单元中,最左边一位是符号位,该位为0时表示数值为“正”;该位为1时表示数值为“负”。

2.整型变量的分类

根据占用内存字节数的不同,整型变量分为四类:

●基本整型(类型关键字为int);

●短整型(类型关键字为short [int]);

●长整型(类型关键字为long [int]);

●无符号整型。

其中无符号整型又分为无符号基本整型(用unsigned [int]表示)、无符号短整型(用unsigned short表示)和无符号长整型(用unsigned long表示)三种,只能用来存储无符号整数。

如果不指定unsigned或指定signed,则存储单元中最高位代表符号(0为正,1为负)。如果指定 unsigned,为无符号型,则存储单元中全部二进制位都用来存放数本身,而不包括符号。因此一个无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。例如:

int x;

unsigned int y;

变量x的取值范围是-32 768~32 767,变量y的取值范围是0~65 535(在Turbo C环境下)。如下所示,分别表示有符号整型变量x和无符号整型变量y的最大值。

(1)有符号整型数据:最大值表示32 767。

(2)无符号整型数据:最大值表示65 535。

表2-1列出了C语言中各类整型数据所分配的内存字节数及数的表示范围。

表2-1 各类整型数据所分配的内存字节数及数的表示范围

3.整型变量的定义

C语言程序设计中,所有用到的变量都必须在程序中先定义,即类型定义或类型说明,也就是“先定义,后使用”。例如:

int num;           //定义变量 num为整型

unsigned short max,min;   //定义变量 max、min 为无符号短整型

long total,sum;       //定义变量total、sum 为长整型

【例2.2】 整型变量的定义与使用。

#include <stdio.h>

void main()

{  int num1,num2,sum;   // 定义num1、num2、sum为整型变量

   unsigned num3;     // 定义num3为无符号整型变量

   num1 = 100;

   num2 = -50;

   num3 = 10;

   sum = num1+num2+num3;

   printf("sum = %d\n",sum);

}

可以看到不同类型的整型数据可以进行算术运算。在本例中是int型数据与unsigned int型数据进行相加、相减运算。

注意:在Turbo C中,一个int型变量的最大值是32 767,如果再加1则会出现数据溢出。

【例2.3】 整型数据的溢出。

#include <stdio.h>

void main()

{

  int a,b;

  a=32767;

  b=a+1;

  printf("%d,%d\n",a,b);

}

上例在Turbo C下输出值是32 767、-32 768;在VC 6.0下,输出值是32 767、32 768。因为int类型在Turbo C下默认占两个字节,在VC 6.0下默认占四个字节,32 768不会导致溢出。

2.3.3 整型常量的类型

既然整型变量有类型,那么整型常量也应该有类型,才能在赋值时匹配。假定整型数据在内存中占两个字节,赋值时应注意以下几点。

(1)一个整数,如果其值在-32 768~+32 767范围内,则认为它是int型,它可以赋值给int型和long int型变量。

(2)一个整数,如果其值超过了上述范围,而在-2 147 483 648~+2 147 483 647范围内,则认为它是长整型,可以将它赋值给一个long int型变量。

(3)如果所用的C版本(如Turbo C)分配给short int与int型数据在内存中占据的长度相同,则它的数据范围与int型相同。因此一个int型的常量同时也是一个short int型常量,可以赋给int型或short int型量。

(4)一个整常量后面加一个字母u或U,就会被认为是unsigned int型,如12345u,在内存中按unsigned int规定的方式存放(存储单元中最高位不作为符号位,而用来存储数据)。

(5)在一个整常量后面加一个字母l或L,则认为是long int型常量。

例如,123l、432L、0L用于函数调用中。