C

C 知识量:16 - 74 - 317

15.1 背景知识><

二进制- 15.1.1 -

我们在日常生活中通常使用的计数制是10进制,例如:3650可以写成:3×1000 + 6×100 + 5×10 + 0×1,如果换成用10的幂来表示则为:3×103+ 6×102+ 5×101+ 0×100

由于计算机电路只能通过开闭来表达信息,因此,程序只能被编译为0和1,这种情况最适合使用二进制。那么,1101就表示:1×23+ 1×22+ 0×21+ 1×20,如果换算为十进制就是:1×8 + 1×4 + 0×2 + 1×1 = 13。

二进制整数- 15.1.2 -

通常,1字节包含8位。可以从左往右给这8位分别编号为7~0,即位编号。在1字节中,位编号是7的位被称为高阶位,位编号是0的位被称为低阶位。每一位的位值对应于2的相应指数。如图所示:

二进制整数.png

其中,128是2的7次幂,以此类推。

如果所有位都用来表示数值,1个字节可以表示的最大数是255,因为,如果每一位都是1,即:11111111,计算其位值之和就是:128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255;1个字节可以表示的最小数是0,此时,每一位都是0,即:00000000。因此,1字节可储存0~255范围内的数字,总共256个值。

有符号整数- 15.1.3 -

首先需要知道的是,如何表示有符号整数取决于硬件,而不是C语言。表示有符号整数有多种方法。

1、符号量表示法。即用1位(如,高阶位)储存符号,只剩下7位表示数字本身。此时,10000001表示-1,00000001表示1。因此,其表示范围是-127~+127。这种方法的缺点是有两个0:+0和-0。这很容易混淆,而且用两个位组合来表示一个值也有些浪费。

2、二进制补码表示法。与符号量表示法一样,二进制补码用1字节中的后7位表示0~127,高阶位设置为0。如果高阶位是1,则表示的值为负。但二进制补码表示法确定负值的方法与符号量表示法不同。要计算一个负整数,就由一个9位组合100000000(256的二进制形式)减去一个负数的位组合,结果是该负值的量。例如:-128就是100000000-10000000,即10000000(128)。类似地,10000001是-127,11111111是-1。该方法可以表示-128~+127范围内的数。

其实,要得到一个二进制补码数的相反数,最简单的方法是反转每一位(即0变为1,1变为0),然后加1。例如:1是00000001,那么-1则是11111110+1,即:11111111。

3、二进制反码表示法。该方法通过反转位组合中的每一位形成一个负数。例如,00000001是1,那么11111110是-1。这种方法也有一个-0,即:11111111。该方法能表示-127~+127之间的数。

二进制浮点数- 15.1.4 -

浮点数分两部分储存:二进制小数和二进制指数。

1、二进制小数。

如果用十进制表示一个小数,例如:0.365,可以拆分为:3/10 + 6/100 + 5/1000,从左往右,各分母都是10的递增次幂。

如果使用二进制表示一个小数,例如:.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、浮点数表示法。

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

八进制- 15.1.5 -

八进制基于8的幂,用0~7表示数字,正如十进制用0~9表示数字一样。例如,八进制数365(在C中写作0365)表示为:3×82 + 6×81 + 5×80 ,换算成十进制的值为245。

关键的一点是:每个八进制位对应3个二进制位,这种关系使得八进制与二进制之间的转换很容易。例如,八进制数0377的二进制形式是11111111。即,用111代替0377中的最后一个7,再用111代替倒数第2个7,最后用011代替3,并舍去第1位的0。这表明比0377大的八进制要用多个字节表示。这是八进制唯一不方便的地方:一个3位的八进制数可能要用9位二进制数来表示。

八进制位与二进制位的对应关系:

  • 0对应000

  • 1对应001

  • 2对应010

  • 3对应011

  • 4对应100

  • 5对应101

  • 6对应110

  • 7对应111

十六进制- 15.1.6 -

十六进制基于16的幂,用0~15表示数字。但是,由于没有单独的数表示10~15,所以用字母A~F来代替,而且A~F既可用小写也可用大写。例如:十六进制数A3F(在C中写作0xA3F)表示为:10×162 +3×161+ 15×160 ,换算成十进制的值为2623。

每个十六进制位都对应一个4位的二进制数(即4个二进制位),那么两个十六进制位恰好对应一个8位字节。第1个十六进制表示前4位,第2个十六进制位表示后4位。因此,十六进制很适合表示字节值。例如:十六进制1对应二进制0001,十六进制A(十进制的10)对应二进制1010,十六进制F(十进制的15)对应二进制1111。