1.2 进位计数制及其转换

n进制数,以十进制为例,
(N)10 = 1234.56
(N)2 = 1103+2102+3101+4100+510-1+610-2
以上式子叫做按权展开式。二进制、八进制等与之类似。展开式所得结果即为十进制。

1.2.1 各进制数的表示

通常,
十进制数在数字的右下角标注10或D
二进制数在数字的右下角标注2或B
八进制数在数字的右下角标注8或O,但在C语言中是在数的前面加上数字0
十六进制在数字的右下角标注16或H,但在C语言中是在数的前面加上数字0X或0x

1.2.2 进制转换

  • 十进制转换为二进制(转化为其他进制同理,将基数改为对应的即可,如八进制就是8)
  1. 整数部分不断除基数2,并记下余数,直到商为0为止。然后将余数倒过来拼接即为二进制数的整数部分。
  2. 小数部分不断乘基数2,并记下整数部分,直到结果的小数部分为0或达到一定精度为止。然后将整数部分顺次拼接即为二进制数的小数部分。
  • 二进制<->八进制

二转八:

  1. 将二进制数的每三位数分一组,不足3位的,小数点前的在左边补0,小数点后的在右边补0,直到补满3位。
  2. 对每组按权展开式计算结果,结果拼接即为八进制数。

八转二:

  1. 将每位八进制数用3位二进制数表示即可(通过除2法)
  • 二进制<->十六进制

操作同二八转换,只是分组时按照4位一组。发现了吗,23=8,24=16,因为具有2的指数整数倍的关系,因而可以直接进行转换。

  • 任意进制转换

如(135)7 = (75)10 = (203)2
即,非上述进制转换,需先按权展开后得到十进制数,在进行对应转换。

1.3 机器数的表示形式及其表示范围

1.3.1 真值与机器数

  1. 真值:直接用“+”和“-”来表示符号的二进制数。
  2. 机器数:把一个数连通其符号在内在及其中的表示加以数值化。一般用最高有效为来表示数的符号,正数用0表示,负数用1表示。如 01011为二进制正数+1011。11011为二进制负数-1011。

    1.3.2 原码

    也称“符号-数值表示”。第一位表示符号位,正数为0,负数为1,其余各位表示数值部分。
  • 在原码表示中,有两种不同形式的0,即:

    • [+0]原 = 000….0 或 0.00…0
    • [-0]原 = 100….0 或 1.00…0

      1.3.3 反码

      又称“对1的补数”。第一位表示符号位,正数为0,负数为1。对于正数,反码和其原码相同;对于负数,反码的数值是将其源码数值按位求反得到的。
      如N = -01010,[N]原 = 101010,[N]反 = 110101
  • 在反码表示中,有两种不同形式的0,即:

    • [+0]反 = 000….0 或 0.00…0
    • [-0]反 = 111…1 或 1.11…1

      1.3.4 补码

      又称“对2的补数”。正数的补码与其原码、反码是相同的。负数的补码,符号位为1,数值部分将其原码数值部分“按位求反,末位加1”。
      如N = -01010,[N]原 = 101010,[N]补 = 110110
  • 在补码表示中,0的表示形式是唯一的,即:

    • [+0]补 ==[-0]补 = 000….0 或 0.00…0

      1.3.5 补码的加减运算

  • [N1+N2]补 = [N1]补 + [N2]补

  • [N1-N2]补 = [N1]补 + [-N2]补
  • 如果符号位产生进位,则将其舍弃。
  • 运算结果的符号位为0,说明是正数的补码,否则是负数的补码。

    1.3.6 无符号整数

    在某些情况下,要处理的数全是整数,此时再保留符号位就没有意义了,可以把最高位也作为树脂处理,这样的数成为无符号数。

  • 16位无符号数的表示范围是[0,65535]

  • 8位无符号数的表示范围是[0,255]

    1.3.7 字符表示法

    计算机中的字符包括以下几种类型:

  • 字母

  • 数字
  • 专用字符:+,-,*,/,↑,SP(space 空格),…
  • 非打印字符

这些字符在机器里必须用二进制数来表示。计算机常采用美国信息交换标准代码(American Standard Code for Information Interchange,ASCII)来表示。这种代码用1个字节(8位二进制码)来表示一个字符,其中低7位为字符的ASCII值,最高位一般用作校验位。

1.4 二进制数的位运算

1.4.1 与运算(AND)

又称为逻辑乘,可用符号“·”或“∧”来表示,C语言中用“&”来表示。如有A、B两个逻辑变量,可能有的取值情况只有4种。
都取1才为1

A B A&B
0 0 0
0 1 0
1 0 0
1 1 1

1.4.2 或运算(OR)

又称为逻辑加,可用符号“+”或“∨”来表示,C语言中用“|”来表示。如有A、B两个逻辑变量,可能有的取值情况只有4种。
任一为1就为1

A B A|B
0 0 0
0 1 1
1 0 1
1 1 1

1.4.3 非运算(NOT)

又称为逻辑反,C语言中用“~”来表示。

A ~A
1 0
0 1

1.4.4 异或运算(XOR)

“异或”运算可用符号“⊕ ”来表示,C语言中用“^”来表示。如有A、B两个逻辑变量,可能有的取值情况只有4种。
取值不同才为1

A B A^B
0 0 0
0 1 1
1 0 1
1 1 0