C 语言中的数据类型关键字

不仅变量和常量不同,不同的数据类型之间也有差异。一些数据类型表示数字,一些数据类型表示字母(更普遍地说是字符)。C 通过识别一些基本的数据类型来区分和使用这些不同的数据类型。如果数据是常量,编译器一般通过用户书写的形式来识别类型(如,42 是整数,42.100 是浮点数)。但是,对变量而言,要在声明时指定其类型。稍后会详细介绍如何声明变量。现在,我们先来了解一下 C 语言的基本类型关键字。K&R C 给出了 7 个与类型相关的关键字。C90 标准添加了 2 个关键字,C99 标准又添加了 3 个关键字(见表 1)。

表 1 C 语言的数据类型关键字

最初 K&R 给出的关键字 C90 标准添加的关键字 C99 标准添加的关键字
int signed _Bool
long void _Complex
short _Imaginary
unsigned
char
float
double

在 C 语言中,用 int 关键字来表示基本的整数类型。后 3 个关键字(long、short 和 unsigned)和 C90 新增的 signed 用于提供基本整数类型的变式,例如 unsigned short int 和 long long int。char 关键字用于指定字母和其他字符(如,#、$、% 和 *)。另外,char 类型也可以表示较小的整数。float、double 和 long double 表示带小数点的数。_Bool 类型表示布尔值(true 或 false),_Complex 和 _Imaginary 分别表示复数和虚数。

通过这些关键字创建的类型,按计算机的存储方式可分为两大基本类型:整数类型和浮点数类型。

位、字节和字

位、字节和字是描述计算机数据单元或存储单元的术语。这里主要指存储单元。

最小的存储单元是位(bit),可以存储 0 或 1(或者说,位用于设置“开”或“关”)。虽然 1 位存储的信息有限,但是计算机中位的数量十分庞大。位是计算机内存的基本构建块。

字节(byte)是常用的计算机存储单位。对于几乎所有的机器,1 字节均为 8 位。这是字节的标准定义,至少在衡量存储单位时是这样。既然 1 位可以表示 0 或 1,那么 8 位字节就有 256(2 的 8 次方)种可能的 0、1 的组合。通过二进制编码(仅用 0 和 1 便可表示数字),便可表示 0~255 的整数或一组字符。

字(word)是设计计算机时给定的自然存储单位。对于 8 位的微型计算机(如,最初的苹果机),1 个字长只有 8 位。从那以后,个人计算机字长增至 16 位、32 位,直到目前的 64 位。计算机的字长越大,其数据转移越快,允许的内存访问也更多。

一、整数和浮点数

整数类型?浮点数类型?如果觉得这些术语非常陌生,别担心,下面先简述它们的含义。如果不熟悉位、字节和字的概念,请阅读上面方框中的内容。刚开始学习时,不必了解所有的细节,就像学习开车之前不必详细了解汽车内部引擎的原理一样。但是,了解一些计算机或汽车引擎内部的原理会对你有所帮助。

对我们而言,整数和浮点数的区别是它们的书写方式不同。对计算机而言,它们的区别是存储方式不同。下面详细介绍整数和浮点数。

二、整数

和数学的概念一样,在 C 语言中,整数是没有小数部分的数。例如,2、−23 和 2456 都是整数。而 3.14、0.22 和 2.000 都不是整数。计算机以二进制数字存储整数,例如,整数 7 以二进制写是 111。因此,要在 8 位字节中存储该数字,需要把前 5 位都设置成 0,后 3 位设置成 1(如图 2 所示)。

使用二进制编码存储整数 7

图 2 使用二进制编码存储整数 7

三、浮点数

浮点数与数学中实数的概念差不多。2.75、3.16E7、7.00 和 2e-8 都是浮点数。注意,在一个值后面加上一个小数点,该值就成为一个浮点值。所以,7 是整数,7.00 是浮点数。显然,书写浮点数有多种形式。稍后将详细介绍 e 记数法,这里先做简要介绍:3.16E7 表示 3.16×107(3.16 乘以 10 的 7 次方)。其中,107=10000000,7 被称为 10 的指数。

这里关键要理解浮点数和整数的存储方案不同。计算机把浮点数分成小数部分和指数部分来表示,而且分开存储这两部分。因此,虽然 7.00 和 7 在数值上相同,但是它们的存储方式不同。在十进制下,可以把 7.0 写成 0.7E1。这里,0.7 是小数部分,1 是指数部分。图 3 演示了一个存储浮点数的例子。当然,计算机在内部使用二进制和 2 的幂进行存储,而不是 10 的幂。现在,我们着重讲解这两种类型的实际区别。

  • 整数没有小数部分,浮点数有小数部分。
  • 浮点数可以表示的范围比整数大。
  • 对于一些算术运算(如,两个很大的数相减),浮点数损失的精度更多。
  • 因为在任何区间内(如,1.0 到 2.0 之间)都存在无穷多个实数,所以计算机的浮点数不能表示区间内所有的值。浮点数通常只是实际值的近似值。例如,7.0 可能被存储为浮点值 6.99999。稍后会讨论更多精度方面的内容。
  • 过去,浮点运算比整数运算慢。不过,现在许多 CPU 都包含浮点处理器,缩小了速度上的差距。
以浮点格式(十进制)存储 π 的值

图 3 以浮点格式(十进制)存储 π 的值

请参阅

(完)

comments powered by Disqus