《好学的C++程序设计》——1.1 计算机怎样计数

本节书摘来自异步社区出版社《好学的C++程序设计》一书中的第1章,第1.1节,作者: 张祖浩 , 沈天晴,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.1 计算机怎样计数

好学的C++程序设计

1.1.1 乒乓球场上的计分牌

我们知道,乒乓球球场上的计分牌有0、1、2、3、4、5、6、7、8和9,共10种牌。计分时,逢十进一,叫做十进制。平常我们用的就是。

我们设想,如果计分牌不是10种,而是0和1两种牌。那该怎么计分呢?那只能逢二进一了,这叫作“二进制”。计算机内部用的是二进制。

我们再设想,如果计分牌有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E和F,共16种牌,其中A、B、C、D、E依次代表10、11、12、13、14和15。计分时,逢十六进一,这叫作十六进制。

3种方法的计分情况,见表1-1。从表中可看出,4位二进制数相当于1位十六进制数,它俩一个个相互对应。计分至15时,二进制1111与十六进制F相对应。此时,如果各再增1分,则二者都同时向高位进位,分别进位成为10000和10。这进位的1分是顶十进制16分的。

《好学的C++程序设计》——1.1 计算机怎样计数

如果用二进制计分牌计分和进位,最后的得分为11101101101101,则表示十进制是多少分呢?我们可从右至左,每4位用一空格隔开,得:0011 1011 0110 1101,分别写出它们所对应的十六进制数得:3 B 6 D。

3B6D是4位十六进制数。此数的每一位满16都要向高位进位。最低位的1分顶1分;高1位则是1分顶16分;高两位则1分顶16×16分;高3位则1分顶16×16×16分……可按此规律,计算得分如下:

十六进制数3 B 6 D = 3×16×16×16 + B×16×16 + 6×16 + D

=12288+11×16×16+96+13=15213(此即十进制得分)

1.1.2 二进制怎样表示全正数和正负数

将表1-1中4位二进制数的全部16个数围成一圈,如图1.1所示。我们设想,在图中A点处把圆周剪开,然后把圆周拉直,竖立起来如图1.2所示。在此图中表示了与十进制数0~15相对应的全正数的4位二进制数。那么,要表明负数怎么办?

如果我们在图1.1中的B点处把圆周剪开,然后把圆周拉直,竖立起来如图1.3所示。此图的上半部0000~0111表示了十进制的正数0~7,下半部1000~1111则表示了十进制的负数−8~−1。这样看来,对于有正负的二进制数,其最高位为0者为正数,最高位为1者为负数。从最高位就能判别数的正负,因此,对于有正负的二进制数,其最高位就被称之为符号位。符号位如图1.3中所示。
《好学的C++程序设计》——1.1 计算机怎样计数

《好学的C++程序设计》——1.1 计算机怎样计数

《好学的C++程序设计》——1.1 计算机怎样计数

图1.3 有正负4位二进制数

读者会问,图1.3中,0000以下的数分明比上半部的数更大,为何反说是负数呢?我们可认为,这些数个个都背了一笔巨债10000(二进制)。因此它们不是“富翁”,而是“负翁”。比如,拿负翁1011来说,负多少?观察可知,若支援它0101,则与1011相加就是10000,就可还清债务啦。可见负翁1011实际是负0101,即负5(十进制)。可见,要问负翁负多少,就看它要还清巨债还差多少。差多少就说明它负多少。

事实上,负数应该是比0000小的数,比如负5,应该由0000-0101计算而得。

《好学的C++程序设计》——1.1 计算机怎样计数

但不好减而向高位借位,算式变为10000-0101,算得结果为1011。因借位而成为“负翁”。

综上可见,4位二进制数可表示全正数范围为0000~1111,即0~15;正负数范围为1000~0111,即−8~7。对更多位二进制数可作类似分析。比如,8位二进制数全正数范围为00000000~11111111,即0~255;正负数范围为10000000~01111111,即−128~127。

1.1.3 计算机中二进制数怎样存储

计算机内部用二进制表示各种数据,每8位二进制数称为一个字节。计算机数据存储在内存中,内存由一个个内存单元组成。一个内存单元可存储一个字节,即8位二进制数。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

上一篇:NGINX引入线程池 性能提升9倍


下一篇:《好学的C++程序设计》——第2章 对基本数据分类存储和访问