2.1.1 整型
整型,顾名思义,整数类型,也就是不带小数点的数值类型。是不是太简单了?不过整型按占用内存大小和所能表示的数值范围又可分为短整型、标准整型、长整型和长长整型,分别用关键字“short int”“int”“long int”“long long int”表示。为什么要分成这么多的类型呢?想要理解这个问题,必须先了解一下内存存储相关的问题,因为这里涉及了内存大小,所以下面简单介绍一下二进制、位和字节的相关知识。
1.二进制、位和字节
我们的日常生活中离不开数字,但生活中通常所使用的都是十进制的数,而计算机只能处理二进制数,所以要把十进制数转换成相对应的二进制数,计算机才能处理。
十进制的规则是逢十进一,它的每一位都是由 0~9 的数字构成。对应的二进制的规则就是逢二进一,它的每一位只能由 0 或 1 构成。此外,在 C 语言中除了二进制,还有可能会用到八进制和十六进制。所以对于“10”,如果它是十进制数,就是 10;如果它是二进制的话,那么它所对应的十进制数就是 2;若是八进制,对应的十进制数就是 8;若是十六进制,则其对应的十进制数就是 16。下面列出十进制数 0~15 所对应的二进制、八进制和十六进制数值。
对于十进制整数 23,转换成对应的二进制码为 10111,二进制码里的每个“0”或“1”称为一个二进制位(Bit),简称位。在两个位中左为高位,右为低位。
内存的最小存储单位为字节(Byte),1 字节有 8 位(即 1 字节可以存放 8 个二进制的“0”或“1”),所以要把整数“23”存放在内存中至少需要 1 字节的空间,位数不够 8 时前面补 0。即十进制数“23”对应的 8 位二进制码为“0001 0111”,如图 2.1 所示。
图 2.1 存储在 1 字节内存中的十进制数“23”
在这 8 位中,位序为 7 的位是最高位,位序为 0 的位是最低位,其中最高位是作“正负”的标记位来使用的,称为符号位,即符号位的位值为“0”表示正数,为“1”表示负数,剩余的 7 位用于存储整数所对应的二进制码,称为数据位。所以 1 字节所能表示的取值范围从–128(二进制码为“1000 0000”)~127(二进制码为“0111 1111”),共 256 个。
要想把一个更小或更大的整数存储到内存中,8 位就显然无能为力了,必须使用更多的内存空间,例如 2 字节就拥有 16 位,可表示的取值范围变成从–32768(二进制码为“1000 0000 0000 0000”)~32767(二进制码为“0111 1111 1111 1111”),共 65536 个,扩大了 256 倍。
大家可以想象一下,如果 C 语言中只有一种整数类型的话,让其使用多少字节的内存比较合适呢?假如使用的内存字节数多,则能表示的数值范围大,但如果用它来存放一些小数值,就会造成内存的浪费;反之,如果使用的内存字节少,可能又存放不了比较大的数值,无论怎样都不能两全其美。
现在明白为什么把整型分为这么多的类型了吧,根据不同的数值大小,使用不同大小字节的内存空间,既不浪费内存空间,又能放得下相应的数值,真正做到“物尽其用”。表 2.1 是本书的开发环境下各种整型的内存大小和所能表示的取值范围。
表 2.1 整型的内存大小和取值范围
一个整型“摇身一变”成了四种类型,是不是挺有趣?其实它还可以再变出四种类型。这次新变出的四种新类型和之前的四种非常类似。
2.无符号整型
前面讲到把一个整数转换成对应的二进制码,其中的最高位是用来标记正负数的符号位。这时会不会有读者突发奇想:“那如果不要这个符号位,把它也变成数据位,用于存放整数的二进制位,不是就能多出 1 倍的取值范围吗?”不得不佩服大家的聪明,也很有想象力,但不够准确。
如果没有了表示正负整数的符号位,那么就没有了负数的表现能力,所存储的全部视为正整数。最终的结果就是正整数的取值范围扩大了一倍,但总的取值范围没变。例如 1 字节所能表示的取值范围从 0(二进制码为“0000 0000”)至 255(二进制码为“1111 1111”),还是 256 个;2 个字节的取值范围从 0(二进制码为“0000 0000 0000 0000”)至 65535(二进制码为“1111 1111 1111 1111”),还是 65536 个。
对于这种没有符号位,全是数据位的整数类型,我们称之为无符号整型,它的关键字为“unsigned”。之前所讲的四种整数类型都是有符号整型,它们也有个关键字“signed”,不过通常不用写,也就是默认的整型就是有符号的,若想使用无符号的整型,前面加上“unsigned”关键字即可。在本书的开发环境下,各种无符号整型的内存大小和取值范围如表 2.2 所示。
表 2.2 无符号整型的内存大小和取值范围
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论