15.1 二进制数、位和字节

书写数字的常用方法是十进制的。例如,2157的千位是2,百位是1,十位是5,个位是7。这意味着可以将2157看作以下形式:

阅读 ‧ 电子书库

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

然而,1000是10的立方,100是10的平方,10是10的1次幂,而且根据约定1是10 (和任意正数)的零次幂。因此,2157也可以写成以下形式:

阅读 ‧ 电子书库

因为这种书写数字的方法是基于10的幂,所以称以10为基数(base 10)书写2157。

姑且认为,十进制得以发展的原因是我们都有10根手指。在某种意义上说,一台计算机的位只有两根手指,原因是它只能被设为0或1,关闭或打开。因此,以2为基数的系统适用于计算机。它用2的幂代替10的幂。以2为基数表示的数字称为二进制数(binary number)。数字2对于二进制数的作用和数字10对于十进制数的作用是相同的。例如,二进制数1101可表示为以下形式:

阅读 ‧ 电子书库

以十进制数形式表示为:

阅读 ‧ 电子书库

可以使用二进制系统将任何整数(如果有足够的位)表示为1和0的一个组合。这种系统非常适于数字计算机使用,数字计算机使用打开和关闭状态的组合来表示信息,而这些状态可以使用1和0表示。让我们看看二进制系统表示1字节整数的方法。

15.1.1 二进制整数

一个字节通常包括8个位。请记住,因为C使用术语字节(byte)表示用于存放系统字符集的空间大小,所以一个C字节可能为8位、9位、16位或其他值。然而,描述存储器芯片和数据传输率时使用的字节指8位字节。为了使问题简单,本章假定1个字节为8位。您可以将这8位从左到右看作是从7到0。在字节中,位7称为高位(high-order bit),位0称为低位(low-order bit)。每位数字是对应2的一个特定的指数。可将字节设想成如图15.1所示的形式。

阅读 ‧ 电子书库

图15.1 位号和位值

这里,128是2的7次幂,依此类推。该字节可以保存的最大数是把所有的位都设置为1: 11111111。该二进制数的值如下:

阅读 ‧ 电子书库

最小的二进制数是00000000,或一个简单的0。一个字节可以存储的数的范围是0到255,总共256个可能的值。通过改变对位模式的解释方式,一个字节可以存储从-128到+127之间的整数,总共还是256个值。例如,unsigned char通常使用一个字节来表示0到255,而signed char通常使用一个字节来表示-128到﹢127。

15.1.2 有符号整数

有符号数的表示方法是由硬件决定,而不是由C决定的。或许表示有符号数最简单的方法就是保留1位(比如高位)来表示数的符号。在一个1字节值中,该方法为数字本身留下7位。使用这样的符号量(sign-magnitude)表示法,10000001 表示-1,00000001 表示 1。那么整个范围是-127 到+127。

这种方法的一个缺点是有两个零:+0和-0。这会引起混淆,而且用两个位组合来表示一个值也有些浪费。

二进制补码(two's-complement)方法避免了这种问题,是当今使用最普遍的系统。我们将讨论这种方法应用于1字节值时的情况。在这种情形下,使用最后7位表示从0到127的值,同时高位设置为0。这部分与符号量方法相同。同样地,如果高位是1,那么该值为负。两种方法的区别在于确定该负数值的方法。从一个9位组合100000000 (256的二进制形式)中减去一个负数的位组合,结果是该负数值的数量。例如,假设一个负数的位组合为10000000。作为一个无符号字节,该组合为128。作为一个有符号的值,该组合为负(位7是1),并且值为100000000-10000000,即10000000(128)。因此,该数为-128 (在符号量表示法中该数为-0)。与之类似,10000001是-127,11111111是-1。该方法表示数的范围是-128到+127。

要对一个二进制补码数取相反数,最简单的方法是反转每一位(将0变为1,将1变为0),然后加1。因为1是00000001,所以-1是11111110+1,即11111111,和前面所看到的是一致的。

二进制反码(one’s-complement)方法通过反转位组合中的每一位以形成一个数的负数。例如,00000001是1,11111110是-1。这种方法也有一个-0: 11111111。其范围(对于1字节值)是-127到+127。

15.1.3 二进制浮点数

浮点数分两部分存储:一个二进制小数和一个二进制指数。让我们了解其实现的方法。

一、二进制小数

普通的小数0.527代表:

阅读 ‧ 电子书库

其中的分母是10的依次递增的幂。在二进制小数中,使用2的幂作为分母,因此二进制小数.101代表:

阅读 ‧ 电子书库

用十进制计数法可表示为:

阅读 ‧ 电子书库

也即0.625。

像1/3这样的许多小数不能用十进制计数法精确地表示。同样,许多小数也不能用二进制计数法精确地表示。实际上,二进制计数法只能精确地表示多个1/2的幂的和。因此3/4和7/8可以精确地表示为二进制小数,但是1/3和2/5却不能。

二、浮点数表示法

要在计算机中表示一个浮点数,需要留出若干个位(其位数取决于系统)存放一个二进制小数,其他位存放一个指数。总之,数字的实际值是二进制小数部分乘以2的指定次幂。比如用4乘以一个浮点数,则指数增加了 2, 二进制小数不改变。用一个不是2的幂的数乘以一个浮点数,则会改变二进制小数,如果有必要也会改变指数部分。