C语言的二进制数、位和字节(二进制数的位与字节是什么关系?)

通常都是基于数字10来书写数字。例如2157的千位是2,百位是1,十位是5,个位是7,可以写成:

2 x 1000 + 1 x 100 + 5 x 10 + 7 x 1

注意,1000是10的立方(即3次幂),100是10的平方(即2次幂),10是10的1次幂,而且10(以及任意正数)的0次幂是1。2157也可以写成:

2 x 10^3 + 1 x 10^2 + 5 x 10^1 + 7 x 10^0

因为这种书写数字的方法是基于10的幂,所以称以10为基底书写2157。姑且认为十进制系统得以发展是得益于我们都有10根手指。从某种意义上看,计算机的位只有2根手指,因为它只能被设置为0或1,关闭或打开。计算机适用基底为2的数制系统。它用2的幂而不是10的幂。以2为基底表示的数字被称为二进制数(binarynumber)。二进制中的2和十进制中的10作用相同。例如,二进制数1101可表示为:

1 x 2^3 + 1 x 2^2 + 0 x 2^1 + 1 x 2^0

以十进制数表示为:

1 x 8 + 1 x 4 + 0 x 2 + 1 x 1 = 13

用二进制系统可以把任意整数(如果有足够的位)表示为0和1的组合。由于数字计算机通过关闭和打开状态的组合来表示信息,这两种状态分别用0和1来表示,所以使用这套数制系统非常方便。我们来学习二进制系统如何表示1字节的整数。

1 二进制整数

1字节包含8位。C语言用字节(byte)表示存储系统字符集所需的大小,所以C字节可能是8位、9位、16位或其他值。不过,描述存储器芯片和数据传输率中所用的字节指的是8位字节。为了简化起见,本章假设1字节 是8位(计算机界通常用八位组(octet)这个术语特指8位字节)。可以从左往右给这8位分别编号为7~0。在1字节中,编号是7的位被称为高阶位(high-order-bit),编号是0的位被称为低阶位(low-orderbit)。每1位的编号对应2的相应指数。可以根据图15.1所示的例子理解字节。

 

C语言的二进制数、位和字节(二进制数的位与字节是什么关系?)

 

这里,128是2的7次幂,以此类推。该字节能表示的最大数字是把所有位都设置为1:11111111。这个二进制数的值是:

128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

而该字节最小的二进制数是00000000,其值为0。1字节可存储0~255范围内的数字,总共256个值。或者,通过不同的方式解释位组合(bit pattern),程序可以用1字节存储-128~+127范围内的整数,总共还是256个值。例如,通常unsigned char用1字节表示的范围是0~255,而signed char用1字节表示的范围是-128~+27。

2 有符号整数

如何表示有符号整数取决于硬件,而不是C语言。也许表示有符号数最简单的方式是用1位(如,高阶位)存储符号,只剩下7位表示数字本身(假设存储在1字节中)。用这种符号量(sign-magnitude)表示法,10000001表示−1,00000001表示1。其表示范围是−127~+127。 这种方法的缺点是有两个0:+0和-0。这很容易混淆,而且用两个位组合来表示一个值也有些浪费。 二进制补码(two’s-complement)方法避免了这个问题,是当今最常用的系统。我们将以1字节为例,讨论这种方法。二进制补码用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。该方法能表示-127~+127之间的数。

3 二进制浮点数

浮点数分两部分存储:二进制小数和二进制指数。下面我们将详细介绍。

1.二进制小数

一个普通的浮点数0.527,表示如下:

5/10 + 2/100 + 7/1000

从左往右,各分母都是10的递增次幂。在二进制小数中,使用2的幂作为分母,所以二进制小数.101表示为:

1/2 + 0/4 + 1/8

用十进制表示法为:

0.50 + 0.00 + 0.125

即是 0.625.

许多分数(如,1/3)不能用十进制表示法精确地表示。与此类似,许多分数也不能用二进制表示法准确地表示。实际上,二进制表示法只能精确地表示多个1/2的幂的和。3/4和7/8可以精确地表示为二进制小数,但是1/3和2/5却不能。

浮点数表示法

为了在计算机中表示一个浮点数,要留出若干位(因系统而异)存储二进制分数,其他位存储指数。数字的实际值是由二进制小数乘以2的指定次幂组成。例如,一个浮点数乘以4,那么二进制小数不变,其指数乘以2,二进制分数不变。如果一份浮点数乘以一个不是2的幂的数,会改变二进制小数部分,如有必要,也会改变指数部分。

版权声明:本文内容由互联网用户投稿发布,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2211788188@qq.com 举报,一经查实,本站将立刻删除。如需转载请注明出处:https://www.wptmall.com/a/article/18027

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注